Столбец идентификатора сводной таблицы Laravel

#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 , и может вызвать довольно неприятные ошибки, поскольку последнее переопределит первое. Если он вам действительно нужен, хотя бы измените его название.