web-dev-qa-db-fra.com

Laravel blade check vide foreach

Je veux vérifier si mon foreach est vide afin que le balisage HTML de base ne soit pas affiché avec aucun résultat à l'intérieur. J'essaie de l'envelopper dans une instruction if, puis si elle est vide, ne rien faire d'autre en boucle. 

@if ($status->replies === '')

@elseif
<div class="media-body reply-body">
    @foreach ($status->replies as $reply)
        <p>{{ $reply->body }}</p>
    @endforeach
</div>
@endif

@if (!(empty($status->replies))
<div class="media-body reply-body">
    @foreach ($status->replies as $reply)
        <div class="media">
            <a class="pull-left" href="{{ route('profile.index', ['username' => $reply->user->username]) }}">
                <img class="media-object" alt="{{ $reply->user->getNameOrUsername() }}" src="{{ $reply->user->getAvatarUrl() }}">
            </a>
            <div class="media-body">
                <h5 class="media-heading"><a href="{{ route('profile.index', ['username' => $reply->user->username]) }}">{{ $reply->user->getNameOrUsername() }}</a></h5>
                <p>{{ $reply->body }}</p>
                <ul class="list-inline list-replies">
                    <li>
                        <a href="{{ route('status.like', ['statusId' => $reply->id]) }}"><i class="fa fa-thumbs-up"></i></a>
                    {{ $reply->likes->count() }} {{ str_plural('like', $reply->likes->count()) }}</li>
                    <li>{{ $reply->created_at->diffForHumans() }}</li>
                </ul>
            </div>
            <hr>
        </div>
    @endforeach
</div>
@endif
30
Sam

Vérifiez la documentation pour le meilleur résultat:

@forelse($status->replies as $reply)
    <p>{{ $reply->body }}</p>
@empty
    <p>No replies</p>
@endforelse
132
cre8

Je pense que vous essayez de vérifier si le tableau est vide ou non. Vous pouvez le faire comme ceci: 

@if(!$result->isEmpty())
     // $result is not empty
@else
    // $result is empty
@endif

RéférenceisEmpty ()

26
Kiran Subedi

Faire écho aux données si elles existent

Parfois, vous pouvez souhaiter faire écho à une variable, mais vous ne savez pas si la variable a été définie. Nous pouvons exprimer cela en code verbose PHP comme ceci:

{{ isset($name) ? $name : 'Default' }}

Cependant, au lieu d’écrire une déclaration ternaire, Blade vous fournit le raccourci pratique suivant:

{{ $name or 'Default' }}

Dans cet exemple, si la variable $ name existe, sa valeur sera affichée. Cependant, s'il n'existe pas, le mot par défaut sera affiché.

De https://laravel.com/docs/5.4/blade#displaying-data

4
Nabeel Shah

C'est un tableau, donc ==== '' ne fonctionnera pas (le === signifie qu'il doit s'agir d'une chaîne vide.) 

Utilisez count () pour identifier le tableau avec tous les éléments (count renvoie un nombre égal ou supérieur à 1, sera évalué à true, 0 = false.)

@if (count($status->replies) > 0)
 // your HTML + foreach loop
@endif
2
William Turrell

Vous devriez utiliser empty ()

@if (!empty($status->replies)) 

<div class="media-body reply-body">
    @foreach ($status->replies as $reply)
        <p>{{ $reply->body }}</p>
    @endforeach
</div>

@endif

Vous pouvez utiliser count, mais si le tableau est plus grand, cela prend plus de temps, si vous avez seulement besoin de savoir s'il est vide, vide est le meilleur choix.

2
iain

C'est ma meilleure solution si j'ai bien compris la question:

Utilisation de la méthode $object->first() pour exécuter le code dans l'instruction if une fois, c'est-à-dire lors de la première boucle. Le même concept est vrai avec $object->last().

    @if($object->first())
        <div class="panel user-list">
          <table id="myCustomTable" class="table table-hover">
              <thead>
                  <tr>
                     <th class="col-email">Email</th>
                  </tr>
              </thead>
              <tbody>
    @endif

    @foreach ($object as $data)
        <tr class="gradeX">
           <td class="col-name"><strong>{{ $data->email }}</strong></td>
        </tr>
    @endforeach

    @if($object->last())
                </tbody>
            </table>
        </div>
    @endif
0