使用Laravel中的Eloquent使用Foreach循环反转数组元素

时间:2014-05-05 01:48:06

标签: php arrays laravel eloquent

我的分数表有不同的评分,字符串和单选按钮。

现在我想循环使用这些。通常我会像这样解决它:

 <table>
    <tr>
        <th>ID</th>
        <th>Type</th>
        <th>Comment</th>
    </tr>
    @foreach($scores as $score)

    <tr>
        <td>{{$score->id}}</td>
        <td>{{$score->ratingradio}}</td>
        <td>{{$score->ratingtext}}</td>
    </tr>

    @endforeach
</table>

但我不希望订单被反转,但我也想要将数组切片,以便它只输出数组的最后20个元素。

我试图在我的控制器中解决这个问题:

$scores = Score::where('unit_id', $id)->where('created_at', '>', Carbon::now()->subDays(3))->get();


// Save all ratingtexts in an array
$comments = $scores->lists('ratingtext');
$commenttype = $scores->lists('ratingradio');
// Get the last 20 Elements of the Array
$comments = array_slice($comments, -20, 20, true);
// Reverse the array, to have the latest element first displayed
$comments = array_reverse($comments, true);

然后循环浏览$ comments。但我不想只显示评论,我也希望能够显示有关此元素的所有信息。所以最好像上面的方法一样有说服力,我输出$ score-&gt; ratingtext,$ score-&gt; ratingradio,$ score-id,以及我想要的任何东西。

我尝试使用

 @foreach(array_reverse($scores) as $score)

这显然不起作用,因为$ score是一个对象,它期待一个数组。我如何在每个得分表的分数中反向循环?

5 个答案:

答案 0 :(得分:18)

检索最后20个项目非常简单。

$scores = Score::where('unit_id', $id)
    ->where('created_at', '>', Carbon::now()->subDays(3))
    ->orderBy('created_at', 'desc')
    ->take(20)
    ->get();

$scores = $scores->reverse();

完成。

告诉它提取与您的查询匹配的前20个项目,颠倒顺序然后反转集合以获得正确的顺序。

答案 1 :(得分:4)

您可以使用:

array_reverse($scores->toArray());
保持Model对象的

或Eloquent \ Collection方法

$scores->reverse();

查看Eloquent\Collection API

答案 2 :(得分:4)

您也可以轻松地@foreach($scores->reverse() as $score)

答案 3 :(得分:0)

甚至有最简单的方法:

$scores = Score::where('unit_id', $id)
    ->where('created_at', '>', Carbon::now()->subDays(3))
    ->orderBy('created_at', 'desc')
    ->orderBy('id', 'asc')
    ->take(20)
    ->get();

答案 4 :(得分:-1)

通过API查看,您似乎可以使用take()来实现这一点。在查询构建器与集合上运行时,它的行为略有不同,因此您希望首先获取集合。

$scores = Score::where('unit_id', $id)->where('created_at', '>', Carbon::now()->subDays(3))->get()->take(-20);