Comparar variables en Blade

publicado por: Anonymous

Necesito hacer una comparación entre 2 variables:

Controlador:

$files = File::files('images');

foreach ($files as $file) {
    $info[] = pathinfo($file);
}

$books = File::where('status', 1)->select('name')->get();

return view('cataloged.read', compact(['info','books']));

En mi vista Blade tengo algo como esto:

@foreach($books as $book)
    @foreach($info as $file)
        @if($book->name == $file['basename'])
            <p>Book</p>
        @else
            <p>No Book</p> 
        @endif
    @endforeach
@endforeach

En mi base de datos, solo tengo 4 registros:

@if($book->name == $file['basename'])
       <p>Book</p>
@endif

Book Book Book Book

Pero cuando le aumento @else me devuelve siete (7) No Book por cada Book excepto el último que solo devuelve Book.

Book – No book 7 veces
Book – No book 7 veces

Book – No book 7 veces
Book

solución

Basándome en el comentario en el cual explicas que deseas obtener como resultado siete líneas de las cuales:

  • 4 son “Book”
  • 3 son “No Book”

Esto significa que debes iterar por los siete archivos (para obtener siete resultados) almacenados en $infoy dentro de este ciclo, iterar por los cuatro “libros” almacenados en $books, a menos que tengas un parámetro distinto para ubicar más fácilmente los libros sin un bucle:

@foreach ($info as $file)

    @php $hasBook = false; @endphp

    @foreach ($books as $book)

        @if ($book->name == $file['basename'])
            <p>Book</p>

            @php $hasBook = true; @endphp
        @endif


    @endforeach

    @if (!$hasBook)
        <p>No Book</p>
    @endif

@endforeach

El problema que tiene esta solución es que estamos definiendo una variable $hasBook y estamos además cambiando su valor, y esto no debería ser responsabilidad de la Vista. En mi opinión deberías revisar los valores que obtienes en $info y en $book y encontrar/establecer una relación más completa en el controlador o en un servicio (o como tengas estructurada tu aplicación).

Respondido por: Anonymous

Leave a Reply

Your email address will not be published.