[英]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_id
和added_by_type
您需要在User
、 Retailer
和Task
模型中定义一些关系
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();
}
}
要为User
或Retailer
添加Task
,请使用关系方法。
$user->tasks()->create(['product_id' => $productId]);
$retailer->tasks()->create(['product_id' => $productId]);
另一种选择是在Product
与User
和Retailer
之间使用多对多多态关系
您需要在User
、 Retailer
和Product
节点中定义一些关系
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');
}
}
将User
或Retailer
与Product
关联(使用Task
作为变形枢轴)
$user->products()->attach($productId);
$retailer->products()->attach($productId);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.