在Laravel和Eloquent中,您可以将ManyToMany-Relations与数据透视表一起使用。我的问题是枢轴行的自动ID。我可以更改ID的生成方式吗?我想在这个问题上使用UUID。
对于其他对象,您可以在模型中实现此行为,但没有透视对象的模型。
我错过了什么吗?
答案 0 :(得分:8)
是的,无论您通过attach()
还是sync()
向数据透视表添加新记录,都可以为其添加一个键/值数组,以便将其作为第二个项目放入数据透视表中参数。
例如$user->roles()->attach($role, array('id' => $uuid));
如果您这样做,也可以确保id
未设置为自动增量。
值得注意的是,很多人甚至在其数据透视表上都没有id
列,因为除非您计划为其创建模型,否则通常不需要它,或者它包含一些其他外键由于某种原因除了它通常会有的2。
答案 1 :(得分:0)
我认为创建中间模型会更好,否则每当我们创建新记录时我们都必须添加主uuid。
use Webpatser\Uuid\Uuid;
use Illuminate\Database\Eloquent\Relations\Pivot;
class ProjectAssignee extends Pivot
{
public $incrementing = false;
protected $keyType = 'string';
protected $primaryKey = 'id';
protected $guarded = [];
public static function boot()
{
parent::boot();
self::creating(function ($model) {
$model->id = (string) Uuid::generate(4);
});
}
}
现在我们可以轻松创建附件
Project::first()->assignees()->attach(Assignee::inRandomOrder()->take(5)->pluck('id')->toArray());
别忘了,要链接using
方法来告知有关中间表的关系。
public function assignees(){return $this->belongsToMany(
Assignee::class,
'projects_assignees',
'project_id',
'assignee_id')
->using(ProjectAssignee::class);}
答案 2 :(得分:0)
请注意此处:枢纽分析表上的id
可能在执行join
时引起混乱,因为它最终会与联接表的id
位于同一行,并且可能导致令人讨厌的错误,因为后者会覆盖前者。如果您真的需要一个,请至少更改它的名称。