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

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

03.07.2014 02:17:29 Просмотров 44 Источник

В Laravel и Eloquent вы можете использовать ManyToMany-отношения со сводной таблицей. Проблема в моем случае-это автоматический идентификатор сводной строки. Можно ли изменить способ генерации идентификатора? Я хочу использовать UUIDs для этого дела.

Для других объектов вы можете просто реализовать это поведение в модели, но для объектов pivot модели нет.

Я что-то пропустил?

У вопроса есть решение - Посмотреть?

Ответы - Столбец идентификатора сводной таблицы Laravel / Laravel Pivot table id column

Является ответом!
user1669496

03.07.2014 04:21:50

Да, везде, где вы добавляете новые записи в сводную таблицу, либо через attach(), либо sync(), вы даете ему массив ключей/значений дополнительных элементов, чтобы поместить в сводную таблицу в качестве второго параметра.

Так, например, $user->roles()->attach($role, array('id' => $uuid));

Если вы делаете это, может быть полезно также убедиться, что Ваш idне настроен на автоматическое увеличение.

Также может быть важно отметить, что многие люди даже не имеют столбца idв своей сводной таблице, потому что он обычно не требуется, если вы не планируете создавать модель для него, или он содержит какой-то другой внешний ключ по какой-то причине, кроме 2, который он обычно имеет.

Afraz Ahmad

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);}
Закрыть X