Обработка отношений в Laravel

#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();
        });