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 按数据透视表中的最新列