Как скрыть блок, если в laravel переменная ложна? - PullRequest
1 голос
/ 06 мая 2020

У меня есть метод вывода переменной в представление. В представлении я проверяю, истинна ли переменная, затем показываю желаемый блок, а если ложь, то не показываю блок. Но у меня почему-то это не работает.

@if($mainAlbum)
   <div class="card">
      <a href="{{route('allAlbums', ['id' => $user->id])}}"><h1 class="mt-2 mb-2" style="font-size: 0.9rem; margin-left: 5px; color: black;">Плейлисты<img src="{{asset('img/right.png')}}" width="11"> </h1></a>
      @foreach($mainAlbum as $album)
          <a href="{{route('album', ['id' => $user->id, 'album' => $album->id])}}"><img src="{{$album->cover}}" class="img-fluid"></a>    
      @endforeach
   </div>
@endif

и способ

public function index($id) {
    $user = User::find($id);
    $posts = $user->profile()->orderBy('created_at', 'desc')->paginate(2);
    $mainVideo = $user->profileVideo()->orderBy('created_at', 'desc')->limit(1)->get();
    $mainAlbum = $user->profileAlbums()->orderBy('created_at', 'desc')->limit(1)->get();
    return view('profile.profile', compact('user', 'posts', 'mainVideo', 'mainAlbum'));
}

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Проблема в том, что get() всегда возвращает коллекцию, не имеет значения, есть внутри альбом или нет, поэтому @if($mainAlbum) всегда будет правдой.

Я бы сделал следующее :

В вашем контроллере:

public function index($id) {
    // switch 'find' with 'findOrFail' this way it will throw a 404 if no user is found
    $user = User::findOrFail($id);

    $posts = $user->profile()->orderBy('created_at', 'desc')->paginate(2);

    // use 'first' instead of 'get', so it will return a model or null instead of a collection
    $mainVideo = $user->profileVideo()->orderBy('created_at', 'desc')->first();
    $mainAlbum = $user->profileAlbums()->orderBy('created_at', 'desc')->first();

    return view('profile.profile', compact('user', 'posts', 'mainVideo', 'mainAlbum'));
}
  1. Вместо использования find() используйте findOrFail(), поэтому страница выдаст ошибку 404, если пользователь не может быть найден.
  2. Поскольку вы используете limit(1), вы можете использовать first() вместо get(), first() вернет модель или значение null, get() всегда будет возвращать коллекцию, независимо от того, содержит ли она модель или нет.

На ваш взгляд:

@if($mainAlbum)
    <div class="card">
        <a href="{{ route('allAlbums', ['id' => $user->id]) }}">
            <h1 class="mt-2 mb-2" style="font-size: 0.9rem; margin-left: 5px; color: black;">
                Плейлисты <img src="{{ asset('img/right.png') }}" width="11">
            </h1>
        </a>
        <a href="{{ route('album', ['id' => $user->id, 'album' => $mainAlbum->id]) }}">
            <img src="{{ $mainAlbum->cover }}" class="img-fluid">
        </a>
    </div>
@endif
  1. Вы можете избавиться от @foreach, так как ваша переменная теперь будет содержать модель вместо collection
  2. Ваш @if чек теперь работает, так как $mainAlbum будет содержать модель или ноль
0 голосов
/ 06 мая 2020

Перед вашим @if () в шаблоне добавьте {{ dd($mainAlbum) }}

Если вы ожидаете, что будет отображаться блок , а не , убедитесь, что возвращаемое значение - ложный (т.е. null, false или 0), а не правдивое значение, такое как строка (например, "", "false", "null") или Object или Array.

Если вы ожидаете его отображения, убедитесь, что это истинное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...