2016-11-22 2 views
0

Предположим, что в базе данных имеется 2 таблицы: user, appUser (пользователь имеет один appUser и отношение). Имея идентификатор пользователя, чтобы обновлять данные appUser, мы можем использовать следующий код (если нет appUser относительной модели):Eloquent: отношение к модели доступа или создать новое

$user = user::find($userID); 
if(count($user->appUser) == 0){ 
    $appUser = new appUser(); 
    $appUser->column = $value; 
    $user->appUser->save(); 
} else { 
    $appUser = $user->appUser; 
    $appUser->column = $value; 
} 
$user->appUser()->save($appUser); 

Выглядит хорошо, но что, если я быть_наст другой контакт таблица (appUser имеет один контакт), поэтому для обновления контактов, мы должны добавить еще сослагательное наклонение и ELSES, чтобы убедиться, что appUser и существуют контактные отношения. Мой вопрос в том, что есть какой-то краткий путь к загрузить отношение и создать новое, если не существует в laravel eloquent?

В этом случае было бы как:

$user = user::find($userID); 
// No Exception! 
$user->appUser->column = $value; 
$user->appUser->save(); 

ответ

1

По Laravel 5.3.23, есть новый withDefault метод, добавленный к HasOne отношениям, которые должны помочь с этим.

В вашем примере, ваша user модели будет иметь следующее соотношение:

public function appUser() { 
    return $this->hasOne(appUser::class)->withDefault(); 
} 

Что это будет делать это, если нет связанных записей в базе данных, она возвращает новый экземпляр связанных с ним (appUser) класс. Таким образом, ваш код будет выглядеть так:

$user = user::find($userID); 
// if user has an appuser, $user->appUser will return it; 
// otherwise, it will return a new instance of your appUser model 
$user->appUser->column = $value; 
$user->appUser()->save(); 
Смежные вопросы