Laravel Pivot表id列

时间:2014-07-03 10:17:30

标签: laravel pivot eloquent uuid

在Laravel和Eloquent中,您可以将ManyToMany-Relations与数据透视表一起使用。我的问题是枢轴行的自动ID。我可以更改ID的生成方式吗?我想在这个问题上使用UUID。

对于其他对象,您可以在模型中实现此行为,但没有透视对象的模型。

我错过了什么吗?

3 个答案:

答案 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位于同一行,并且可能导致令人讨厌的错误,因为后者会覆盖前者。如果您真的需要一个,请至少更改它的名称。