Laravel hoja comprobar foreach vacío

6 minutos de lectura

avatar de usuario
Sam

Quiero verificar si mi foreach está vacío para que el marcado html básico no se muestre sin resultados dentro. Estoy tratando de envolverlo en una declaración if y luego, si está vacío, no haga nada más en bucle foreach.

@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="https://stackoverflow.com/questions/32652818/{{ 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="https://stackoverflow.com/questions/32652818/{{ 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="https://stackoverflow.com/questions/32652818/{{ 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

  • Si $status->replies está vacío, ¿por qué no probar eso usando vacío()?… @if (empty($status->replies)) en lugar de asumir que si está vacío será una cadena?

    – Marcos Baker

    18 de septiembre de 2015 a las 13:09


avatar de usuario
cre8

Comprobar el documentación para el mejor resultado:

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

  • Puede que sea antiguo, pero ¡Dios mío, ahora tengo tanto código que reescribir! ¡No tenía idea de que esto existía!

    – Nahbyr

    25 de marzo de 2018 a las 22:46

  • ¡Respuesta de oro para este tipo!

    – Kray

    12 de febrero de 2020 a las 5:28

  • por cierto, esto no funciona para representar tablas, porque obtendrá una tabla sin filas (o con una sola fila) con un párrafo adentro, mientras que lo que necesita es ninguna tabla más un párrafo

    – por qué

    14 de enero de 2021 a las 1:12


  • Sigue siendo útil para mí.

    – Masiorama

    17 de marzo a las 10:49

Creo que está tratando de verificar si la matriz está vacía o no. Puede hacer esto:

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

Referencia esta vacio()

  • no siempre uno puede usar @forelse (por ejemplo, para renderizar tablas no vacías). uno no puede también usar @empty (ni siquiera empty($collection)!) con colecciones vacías. ¡La solución sugerida por usted sigue siendo el último recurso! ¡gracias!

    – por qué

    14 de enero de 2021 a las 1:09


avatar de usuario
iain

Deberías usar vacío ()

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

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

@endif

Puede usar contar, pero si la matriz es más grande, lleva más tiempo, si solo necesita saber si está vacío, vacío es el mejor para usar.

  • Gracias por su respuesta al usar este método, aparece el siguiente error: syntax error, unexpected ':', expecting '('

    – sam

    18 de septiembre de 2015 a las 13:22

  • actualicé la primera publicación con el código completo, cuando eliminé la declaración if, simplemente agregamos la página se carga sin errores: S

    – sam

    18/09/2015 a las 13:42


  • Si elimina todo lo que está dentro de su foreach, ¿aún recibe el error?

    – iain

    21 de septiembre de 2015 a las 10:11

  • Si $status es una colección, comprobando con empty() no funcionará, siempre devolverá verdadero. Debe utilizar uno de $status->isEmpty(), $status->count()o count($status).

    – Matt K.

    2 de diciembre de 2015 a las 16:27

Es una matriz, por lo que ==== '' no funcionará (el === significa que tiene que ser una cadena vacía).

Usar contar() para identificar que la matriz tiene algún elemento (count devuelve un número, 1 o más se evaluará como verdadero, 0 = falso).

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

avatar de usuario
nabeel shah

Hacer eco de los datos si existen

A veces, es posible que desee repetir una variable, pero no está seguro de si la variable se ha configurado. Podemos expresar esto en un código PHP detallado así:

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

Sin embargo, en lugar de escribir una declaración ternaria, Blade le proporciona el siguiente atajo conveniente:

{{ $name or 'Default' }}

En este ejemplo, si existe la variable $name, se mostrará su valor. Sin embargo, si no existe, se mostrará la palabra Predeterminado.

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

  • Ahora que Laravel requiere PHP 7.1, puede usar el operador de fusión nula: {{ $name ?? ‘Predeterminado’}} (El operador “o” está en desuso en Laravel 5.6)

    – jannej

    21 de junio de 2018 a las 9:03

Usando el siguiente código, primero se puede verificar que la variable esté configurada o no usando @isset de la directiva laravel y luego verificar que la matriz esté en blanco o no usando @a menos que la directiva laravel

@if(@isset($names))
    @unless($names)
        Array has no value
    @else
        Array has value

        @foreach($names as $name)
            {{$name}}
        @endforeach

    @endunless
@else
    Not defined
@endif

  • Ahora que Laravel requiere PHP 7.1, puede usar el operador de fusión nula: {{ $name ?? ‘Predeterminado’}} (El operador “o” está en desuso en Laravel 5.6)

    – jannej

    21 de junio de 2018 a las 9:03

avatar de usuario
adscriptor

Esta es mi mejor solución si entendí bien la pregunta:

Uso de $object->first() método para ejecutar el código dentro if declaración una vez, eso es cuando en el primer ciclo. El mismo concepto es cierto con $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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad