Laravel – цикл Foreach – показать конкретное сообщение о типах результата

Поэтому у меня есть таблица сообщений со всеми сообщениями. Я хочу, чтобы прикрепленные сообщения были сверху и нормальными, чтобы следовать за ними. Я смог сделать это обычно с помощью orderBy() в моем запросе.

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

Пример:

Мой запрос:

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

Мой взгляд

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

Что я вижу

 Message text 3 Message text 1 Message text 2 

У меня есть несколько сообщений с «закрепленными» в столбце базы данных. Поэтому я хочу, чтобы прикрепленные отображались наверху с ОПИСАНИЯМИ. Что-то вроде этого:

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

Я попробовал orderBy() и он работает очень хорошо, с точки зрения заказа его от закрепленного до нормального, но я не могу заставить его показать сообщение «Pinned» и «Normal». Как я могу это сделать?

Попробуйте что-то вроде этого (измените 1/0 на true/false или все, что вы используете):

В контроллере:

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

В представлении:

 @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 

Если реальная @foreach часть большая, используйте partial и @each вместо @foreach чтобы избежать дублирования кода.

альтернатива

 @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 

Краткая альтернатива

Не очень читаемый, но если вам просто нужен короткий код, используйте что-то вроде этого:

 @foreach ($rows as $row) <?php !($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