#php #mysql #laravel
#php #mysql #laravel
Вопрос:
Я создаю систему для поддержки реферальных программ. Это позволяет вам отслеживать ссылки, программы и как долго будет храниться cookie. Также позволяет вам легко решить, какую выгоду получит пользователь после направления другого пользователя, например, для регистрации.
Это ‘ для генерации уникального реферального кода при создании реферальной ссылки. Я могу использовать этот код для отслеживания ссылки и связать ее с исходным пользователем, который ею поделился. Заводской метод getReferral создает единственную реферальную ссылку для каждого пользователя для данной программы.
// ReferralLink Model
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
use RamseyUuidUuid;
class ReferralLink extends Model
{
protected $fillable = ['user_id', 'referral_program_id'];
protected static function boot()
{
static::creating(function (ReferralLink $model) {
$model->generateCode();
});
parent::boot();
}
private function generateCode()
{
$this->code = (string)Uuid::uuid1();
}
public static function getReferral($user, $program)
{
return static::firstOrCreate([
'user_id' => $user->id,
'referral_program_id' => $program->id
]);
}
public function getLinkAttribute()
{
return url($this->program->uri) . '?ref=' . $this->code;
}
public function user()
{
return $this->belongsTo(User::class);
}
public function program()
{
return $this->belongsTo(ReferralProgram::class, 'referral_program_id');
}
public function relationships()
{
return $this->hasMany(ReferralRelationship::class);
}
}
Промежуточное программное обеспечение StoreReferralCode
use AppReferralLink;
// ...
public function handle($request, Closure $next)
{
$response = $next($request);
if ($request->has('ref')){
$referral = ReferralLink::whereCode($request->get('ref'))->first();
$response->cookie('ref', $referral->id, $referral->lifetime_minutes);
}
return $response;
}
Пользовательский обработчик событий
class UserReferred
{
use SerializesModels;
public $referralId;
public $user;
public function __construct($referralId, $user)
{
$this->referralId = $referralId;
$this->user = $user;
}
public function broadcastOn()
{
return [];
}
}
И, конечно, вот как я транслирую событие в RegistrationController
protected function create(array $data)
{
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
event(new AppEventsUserReferred(request()->cookie('ref'), $user));
return $user;
}
Я не могу создать связь в базе данных на основании того, кто с кем поделился ссылкой. Что может быть не так с моим кодом?
//referral_relationships schema
Schema::create('referral_relationships', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('referral_link_id');
$table->integer('user_id');
$table->timestamps();
});