Столбец идентификатора сводной таблицы Laravel
В Laravel и Eloquent вы можете использовать ManyToMany-отношения со сводной таблицей. Проблема в моем случае-это автоматический идентификатор сводной строки. Можно ли изменить способ генерации идентификатора? Я хочу использовать UUIDs для этого дела.
Для других объектов вы можете просто реализовать это поведение в модели, но для объектов pivot модели нет.
Я что-то пропустил?
Ответы - Столбец идентификатора сводной таблицы Laravel / Laravel Pivot table id column

03.07.2014 04:21:50
Да, везде, где вы добавляете новые записи в сводную таблицу, либо через attach()
, либо sync()
, вы даете ему массив ключей/значений дополнительных элементов, чтобы поместить в сводную таблицу в качестве второго параметра.
Так, например, $user->roles()->attach($role, array('id' => $uuid));
Если вы делаете это, может быть полезно также убедиться, что Ваш id
не настроен на автоматическое увеличение.
Также может быть важно отметить, что многие люди даже не имеют столбца id
в своей сводной таблице, потому что он обычно не требуется, если вы не планируете создавать модель для него, или он содержит какой-то другой внешний ключ по какой-то причине, кроме 2, который он обычно имеет.

20.01.2020 09:55:18
Я думаю, что создание промежуточной модели делает лучшую работу, иначе нам придется добавлять первичный 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);}