php - 处理Laravel中的关系

标签 php mysql laravel

我正在建立一个支持推荐程序的系统。它允许您跟踪链接,程序以及cookie持续多长时间。还可以让您轻松地确定在引荐其他用户注册后用户将如何受益。

这是为了在创建引荐链接时生成唯一的引荐代码。我可以使用此代码来跟踪链接并将其与共享它的原始用户相关联。工厂方法getReferral为给定程序的每个用户创建单个引用链接。

// ReferralLink Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Ramsey\Uuid\Uuid;

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 App\ReferralLink;

// ...

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;
}


UserReferred事件处理程序

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 \App\Events\UserReferred(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();
        });

最佳答案

您可以这样尝试:

 Schema::create('referral_relationships', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('referral_link_id')->unsigned();
        $table->integer('user_id')->unsigned();
        $table->foreign('referral_link_id')->references('id')->on('referral_links')
             ->onDelete('cascade');
        $table->foreign('user_id')->references('id')->on('users')
             ->onDelete('cascade');
        $table->timestamps();
    });

关于php - 处理Laravel中的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55453986/

相关文章:

php - 我低估了MySQL吗?

php - 如何使用 smalot pdfparser 获取 pdf 的字体详细信息?

PHP 嵌套each/while

Laravel 5.2 传递中间件参数在服务提供者中注册服务容器

php - 使用PHP上传mp3时出错

php - 使用文本样式创建包含子列表的列表

php - ejabberd 外部认证 php sql server

mysql - 程序更新记录慢

Laravel settable 无法按预期工作

laravel - 使用 Laravel 进行分页和 JOIN