繁体   English   中英

如何创建 eloquent 多态关系

[英]How do I create a eloquent Polymorphic relation

我有两个 eloquent 型号 model 用户和零售商。 我想创建一个新的 model “任务”,其中应该有一个字段“add_by”,可以表示用户或零售商。

如何为 Task 创建迁移,以便有一个可以表示用户或零售商的字段?

Schema::create('tasks', function (Blueprint $table) {
   $table->id();
   $table->unsignedBigInteger('product_id');
   $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
   $table->morphes('added_by');
   $table->timestamps();
});

例如,如何创建引用用户的任务?

Task::create([
'product_id' => 1,
'added_by' => ????
]);

另外,当我得到一个任务的 eloquent 实例时,我怎么知道 added_by 是指用户还是零售商?

迁移的语法是$table->morphs(...) ,而不是$table->morphes(...)

$table->morphs('added_by')将创建列added_by_idadded_by_type


选项 1:1-M 多态关系

您需要在UserRetailerTask模型中定义一些关系

User

class User extends Authenticable
{
    public function tasks()
    {
        return $this->morphMany(Task::class, 'added_by');
    }
}

Retailer

class Retailer extends Model
{
    public function tasks()
    {
        return $this->morphMany(Task::class, 'added_by');
    }
}

Task

class Task extends Model
{
    protected $fillable = ['product_id'];
    
    public function added_by()
    {
        return $this->morphTo();
    }
}

Eloquent 关系 - 一对多多态关系


要为UserRetailer添加Task ,请使用关系方法。

$user->tasks()->create(['product_id' => $productId]);

$retailer->tasks()->create(['product_id' => $productId]);

Eloquent 关系 - 插入和更新相关模型


选项 2:MN 多态关系

另一种选择是在ProductUserRetailer之间使用多对多多态关系

您需要在UserRetailerProduct节点中定义一些关系

User

class User extends Authenticable
{
    // Optional
    public function tasks()
    {
        return $this->morphMany(Task::class, 'added_by');
    }

    public function products()
    {
        return $this->morphToMany(Product::class, 'added_by', 'tasks')
                    ->using(Task::class)
                    ->withTimestamps();
    }
}

Retailer

class Retailer extends Model
{
    // Optional
    public function tasks()
    {
        return $this->morphMany(Task::class, 'added_by');
    }

    public function products()
    {
        return $this->morphToMany(Product::class, 'added_by', 'tasks')
                    ->using(Task::class)
                    ->withTimestamps();
    }
}

Product

class Product extends Model
{
    // Optional
    public function tasks()
    {
        return $this->hasMany(Task::class, 'product_id');
    }

    public function users()
    {
        return $this->morphedByMany(User::class, 'added_by', 'tasks')
                    ->using(Task::class)
                    ->withTimestamps();
    }
}

Task

use Illuminate\Database\Eloquent\Relations\MorphPivot;

class Task extends MorphPivot
{
    public $incrementing = true;

    // Optional
    public function added_by()
    {
        return $this->morphTo();
    }

    // Optional
    public function product()
    {
        return $this->belongsTo(Product::class, 'product_id');
    }
}

Eloquent 关系 - 多对多多态关系


UserRetailerProduct关联(使用Task作为变形枢轴)

$user->products()->attach($productId);

$retailer->products()->attach($productId);

Eloquent 关系 - 更新多对多关系

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM