Поэтому у меня есть таблица сообщений со всеми сообщениями. Я хочу, чтобы прикрепленные сообщения были сверху и нормальными, чтобы следовать за ними. Я смог сделать это обычно с помощью 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