Laravel - Foreach循环 - 显示结果类型的特定消息

时间:2016-04-22 01:25:59

标签: php laravel laravel-5.2

所以我有一个包含所有消息的消息表。我希望固定消息在顶部和正常之后跟随。我能够在查询中使用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()并且它的工作非常好,从订购到正常,但是我不能让它显示"固定&#34 ; "正常"信息。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

尝试这样的事情(将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 and @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