Skip to main content

Laravel BelongsTo — стандартные модели.

Думаю каждый кто использовал в своей работе фреймворк 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

3 thoughts to “Laravel BelongsTo — стандартные модели.”

  1. Стоит быть внимательнее при использовании этого метода:
    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();

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *