Laravel 5.x Как создать нового пользователя с ограничением внешнего ключа?

Я могу создать нового пользователя, используя:

User::create([
    'username' => $data[ 'username' ],
    'email' => $data[ 'email' ],
    'first_name' => $data[ 'first_name' ],
    'last_name' => $data[ 'last_name' ],
    'password' => bcrypt($data[ 'password' ]),
]);

Но теперь я хочу создать пользователя, у которого теперь есть ограничение region_id, поэтому я подумал, что это можно сделать, добавив region_id к fillable и добавив его в user create:

User::create([
    'region_id' => $data[ 'region_id'
    'username' => $data[ 'username' ],
    'email' => $data[ 'email' ],
    'first_name' => $data[ 'first_name' ],
    'last_name' => $data[ 'last_name' ],
    'password' => bcrypt($data[ 'password' ]),
]);

В моей миграции я добавил:

$table->integer('region_id')->unsigned();

$table->foreign('region_id')
      ->references('id')
      ->on('regions');

и запустил его с помощью фабрики, просто назначив region_id, но регистрация теперь не работает в приложении и выдает:

Undefined index: region_id

Я снова просмотрел документы и увидел, что могу добавить индекс к миграции в этом поле, но после небольшого чтения кажется, что MySQL действительно может автоматически индексировать внешние ключи.


person mtpultz    schedule 10.07.2015    source источник
comment
Вы уверены, что ваш массив $data действительно имеет значение, хранящееся в $data[ 'region_id']?   -  person Mastergalen    schedule 11.07.2015
comment
Привет @Mastergalen, да, это было так. В Angular я установил директиву select с помощью ngOptions, но передал обратно объект региона параметров, а не region.id для region.name. Спасибо!   -  person mtpultz    schedule 11.07.2015


Ответы (1)


  1. Убедитесь, что массив $data содержит region_id
  2. Не добавляйте region_id в заполняемые поля, лучше сделайте так:

    $region = Region::find($data['region_id']);
    
    $region->users()->create([
       'username' => $data['username'],
       'email' => $data['email'],
       'first_name' => $data['first_name'],
       'last_name' => $data['last_name'],
       'password' => bcrypt($data['password']),
    ]);
    

    Это автоматически добавит поле region_id в пользовательский объект.

Примечание. Убедитесь, что у вас есть связь с регионом hasMany users в модели региона.

person Raviraj Chauhan    schedule 11.07.2015
comment
Спасибо, это прекрасно работает. Что делать, если вам нужно добавить два значения внешнего ключа к пользователям, например: у пользователя есть region_id, а также Rental_id и Vehicle_id? У меня есть все настройки отношений, просто я не уверен, как вы должны установить их с помощью ORM. - person mtpultz; 15.07.2015