Laravel – Foreach loop – Muestra un mensaje específico para los tipos de resultados

Entonces tengo una tabla de mensajes con todos los mensajes. Quiero que los mensajes fijados estén en la parte superior y los normales después. Pude hacer esto normalmente con el método orderBy() en mi consulta.

Sin embargo, quiero mostrar algunos mensajes específicos para todos mis mensajes anclados. Me gustaría tener un encabezado en la parte superior de los mensajes anclados y un encabezado en la parte superior de los mensajes normales para que los usuarios sepan que los mensajes fijados y normales están allí.

Ejemplo:

Mi consulta:

 $rows = Messages::where('active', true)->orderBy('pinned', 'desc')->get(); 

Mi vista

 @foreach ($rows as $row) {{ $row->message }} @endforeach 

Lo que veo

 Message text 3 Message text 1 Message text 2 

Tengo algunos mensajes con “anclado” en la columna en la base de datos. Así que quiero que los anclajes se muestren en la parte superior CON DESCRIPCIONES. Algo como esto:

 Pinned ---------- Message text 3 ---------- Normal ---------- Message text 1 Message text 2 

He intentado con orderBy() y está funcionando bastante bien, en términos de ordenarlo desde fijado a normal, pero no puedo mostrar el mensaje “Fijado” y “Normal”. ¿Cómo puedo hacer esto?

Pruebe algo como esto (cambie 1/0 a true/false o lo que sea que use):

En un controlador:

 $pinned = $rows->where('pinned', 1); $normal = $rows->where('pinned', 0); 

En una vista:

 @if(count($pinned) > 0) Pinned @foreach ($pinned as $row) {{ $row->message }} @endforeach @endif @if(count($normal) > 0) Normal @foreach ($normal as $row) {{ $row->message }} @endforeach @endif 

Si la parte @foreach real es grande, use parcial y @each lugar de @foreach para evitar la duplicación de código.

Alternativa

 @foreach ($rows as $row) @if ($row->pinned === 1 && !isset($pinnedShown)) Pinned {{ $pinnedShown = true }} @endif @if ($row->pinned === 0 && !isset($normalShown)) Normal {{ $normalShown = true }} @endif {{ $row->message }} @endforeach 

Alternativa corta

No es muy legible, pero si solo necesitas un código corto, usa algo como esto:

 @foreach ($rows as $row) pinned == 1 && !isset($pin)) ? : $pin = call_user_func(function(){ echo 'Pinned'; return 1; }); !($row->pinned == 0 && !isset($nor)) ? : $nor = call_user_func(function(){ echo 'Normal'; return 1; }); ?> {{ $row->message }} @endforeach