#laravel #pivot #eloquent #uuid
#laravel #сводная #красноречивый #uuid
Вопрос:
В Laravel и Eloquent вы можете использовать ManyToMany-Отношения со сводной таблицей. Проблема в моем случае заключается в автоматическом идентификаторе сводной строки. Могу ли я изменить способ генерации идентификатора? Я хочу использовать UUID, если уж на то пошло.
Для других объектов вы можете просто реализовать это поведение в модели, но модели для сводных объектов не существует.
Я что-то пропустил?
Ответ №1:
Да, где бы вы ни добавляли новые записи в сводную таблицу, через attach()
или sync()
, вы присваиваете ей массив дополнительных элементов ключ / значение для помещения в сводную таблицу в качестве второго параметра.
Так, например $user->roles()->attach($role, array('id' => $uuid));
Если вы делаете это, может быть полезно также убедиться, что для вашего id
не установлено значение автоматического увеличения.
Также может быть важно отметить, что у многих людей даже нет id
столбца в их сводной таблице, потому что обычно это не требуется, если только вы не планируете создавать для него модель, или по какой-либо причине он содержит какой-либо другой внешний ключ, помимо 2, которые он обычно имеет.
Ответ №2:
Я думаю, что создание промежуточной модели делает работу лучше, иначе нам придется добавлять основной uuid всякий раз, когда мы создаем новую запись.
use WebpatserUuidUuid;
use IlluminateDatabaseEloquentRelationsPivot;
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:
Будьте осторожны здесь: id
в сводной таблице может возникнуть путаница при выполнении join
, поскольку она окажется в той же строке, что и в объединенной таблице id
, и может вызвать довольно неприятные ошибки, поскольку последнее переопределит первое. Если он вам действительно нужен, хотя бы измените его название.