Думаю каждый кто использовал в своей работе фреймворк Laravel и кто пользовался связями belongsTo()
часто сталкивался с проверкой на существование этой связи. Сегодня я покажу вам простой способ как можно упростить себе жизнь используя стандартные модели.
Почти все проекты, в которых я участвую написаны написаны с использованием Laravel. Довольно часто я просматриваю официальную документацию и наткнулся на интересный функционал связей belongsTo()
. Оказывается, мы можем задать стандартную модель или значение, если не будет найдена связь.
Просто пример, у нас есть модель Comment
:
public function user () { return $this->belongsTo('App\User'); }
Если мы захотим вывести имя пользователя в шаблоне, то напишем примерно такой код:
{{$comment->user->first_name}}
Но что если пользователя удалили? Внешние ключи не задали и при удалении пользователя комментарии остались. Или намеренно не затирали комментарии. Тогда в свойстве user
будет NULL
и мы получи ошибку Trying to get property of non-object
. В таком случае мы в самом шаблоне можем сделать проверки:
{{$comment->user->first_name or "John Doe"}}
Или
@if ($comment->user) $comment->user->first_name @else "John Doe" @endif
Можно и дальше в шаблонах писать кучу проверок, а можно использовать более легкий путь. Просто приведем нашу модель к виду:
public function user () { return $this->belongsTo('App\User')->withDefault([ "first_name" => "John Doe" ]); }
Теперь, если не будет найдена связь, метод просто вернет стандартное значение, которое вы указали в методе withDefault()
.
Больше не нужна куча ифов в шаблонах.
Источник: официальная документация Laravel
С какой версии идет поддержка withDefault() ?
Стоит быть внимательнее при использовании этого метода:
public function user()
{
return $this->belongsTo(‘App\User’)->withDefault(function ($user) {
$user->name = ‘Guest’;
});
}
…
$foo = Foo::find(1);
$user = $foo->user;
$bar = Bar::where(‘name’, ‘=’, $user->name)->get();
Bar::where(‘name’, ‘=’, $user->name)->get();
Отработает, так как
$user->name
будет содержать значение.