Laravel 数据透视表 id 列

Posted

技术标签:

【中文标题】Laravel 数据透视表 id 列【英文标题】:Laravel Pivot table id column 【发布时间】:2014-08-24 10:00:42 【问题描述】:

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

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

我错过了什么吗?

【问题讨论】:

【参考方案1】:

在这里要小心:在执行join 时,数据透视表上的id 可能会导致混淆,因为它最终会与连接表的id 位于同一行,并且可能会导致相当讨厌的错误,因为后者将覆盖前者。如果你真的需要一个,至少改变它的名字。

【讨论】:

【参考方案2】:

我认为创建中间模型做得更好,否则我们必须在创建新记录时添加主 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);

【讨论】:

【参考方案3】:

是的,无论您通过attach()sync() 向数据透视表添加新记录的任何位置,您都可以为其提供一个包含附加项的键/值数组作为第二个参数放入数据透视表中。

例如$user->roles()->attach($role, array('id' => $uuid));

如果您这样做,还需要确保您的 id 未设置为自动递增。

可能还需要注意的是,很多人的数据透视表上甚至没有 id 列,因为通常不需要它,除非您计划为其创建模型,或者它包含其他一些外来的出于某种原因,除了它通常具有的 2 之外的其他原因。

【讨论】:

以上是关于Laravel 数据透视表 id 列的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Lucid whereHas 按数据透视表中的最新列

Laravel Eloquent - 查询数据透视表

laravel4 更新数据透视表中的附加列

Laravel - 从数据透视表中获取额外的列值

Laravel - 是不是可以与一个表和一个数据透视表建立多对多关系

Laravel 复选框问题,我无法更新数据透视表