Сохранение связанных записей в laravel
У меня есть пользователи, и пользователи принадлежат к дилеру.
После регистрации пользователя я пытаюсь сохранить нового пользователя и новый дилерский центр.
В базе данных пользователя есть столбец dealership_id
, который я хочу заполнить идентификатором вновь созданного представительства.
Это мой текущий код в методе хранения UserController
.
public function store()
{
$user = new User();
$user->email = Input::get('email');
$user->password = Input::get('password');
$dealership = new Dealership();
$dealership->name = Input::get('dealership_name');
$user->push();
return "User Saved";
}
Попытка использования $user->push();
Данные пользователя обновляются, но дилерская деятельность не создается или не обновляется.
Ответы
Ответ 1
Красноречивый push()
сохраняет модель и ее отношения, но сначала вы должны сказать, что вы хотите вовлечь в отношения.
Поскольку ваша пользовательская модель/таблица содержит идентификатор дилера, я предполагаю, что пользователь может принадлежать только одному дилеру, поэтому отношения должны выглядеть так:
Модель пользователя:
public function dealership()
{
return $this->belongsTo('Dealership');
}
Модель дилера:
public function users()
{
return $this->hasMany('User');
}
Чтобы сохранить пользователя с точки зрения дилера, вы делаете следующее:
$dealership->users()->save($user);
Чтобы связать дилерство с пользователем, вы делаете это:
$user->dealership()->associate($dealership);
$user->save();
Ответ 2
Пожалуйста, проверьте этот ответ, чтобы увидеть разницу между push() и save()
Вам необходимо будет правильно определить ваши отношения в соответствии с документацией
Если это сделано правильно, оно должно работать.
Это то, что делает push():
/**
* Save the model and all of its relationships.
*
* @return bool
*/
public function push()
{
if ( ! $this->save()) return false;
// To sync all of the relationships to the database, we will simply spin through
// the relationships and save each model via this "push" method, which allows
// us to recurse into all of these nested relations for the model instance.
foreach ($this->relations as $models)
{
foreach (Collection::make($models) as $model)
{
if ( ! $model->push()) return false;
}
}
return true;
}
В вашем случае у вас есть один (дилерский) принадлежит многим (пользователям)
В модели "Пользователи":
class Users extends Eloquent {
public function dealership()
{
return $this->belongsTo('Dealership');
}
}
В приведенном выше примере Eloquent будет искать столбец dealership_id в таблице users.
В вашей модели дилера:
class Dealership extends Eloquent {
public function users()
{
return $this->hasMany('User');
}
}
В вашей функции магазина:
public function store()
{
$user = new User();
$user->email = Input::get('email');
$user->password = Input::get('password');
$user->dealership = new Dealership();
$user->dealership->name = Input::get('dealership_name');
$user->push();
return "User Saved";
}
Подробнее читайте здесь красноречивые отношения
Также рассмотрите мой ответ здесь
Ответ 3
Используя push на модели User, Laravel в основном рекурсивно вызывает экономию на всех связанных моделях (что в данном случае равно none, так как вы еще не привязали к нему какие-либо другие модели).
Поэтому, чтобы выполнить то, что вы пытаетесь сделать, вы можете сначала создать пользователя, а затем связать с ним дилерскую сеть, выполнив следующие действия:
$user = new User();
$user->email = Input::get('email');
$user->password = Input::get('password');
$user->save();
$dealership = new Dealership();
$dealership->name = Input::get('dealership_name');
$user->dealerships()->save($dealership);
return "User Saved";
Однако, прежде чем делать это, вы должны убедиться, что ваши модели User and Dealership правильно настроили свои отношения:
Модель пользователя:
public function dealership()
{
return $this->belongsTo('Dealership');
}
Модель дилера:
public function users()
{
return $this->hasMany('User');
}
Ответ 4
Вот как мне удается это сделать.
В вашем контроллере: (Laravel 5)
use Auth;
$dealership->user = Auth::user()->ref_user->staff_id;