Laravel Eloquent检索第一个元素并保持查询结果完好无损?

时间:2014-05-21 01:35:03

标签: sql laravel-4 eloquent

请查看以下代码:

$msgs = Message::where(function($query) use ($start,$end){

    $query->whereBetween('created_at', array($start, $end));

})->orderBy('created_at', 'DESC');

$first = $msgs->first()->created_at;
$ids = $msgs->lists('id');

我要做的是获取查询结果集的最新日期并同时从结果中获取所有ID。但代码不起作用,因为$ msgs由$ msgs-> first()函数更改。我想知道是否有办法让我获得查询结果的第一个元素而不影响整个结果集?感谢

2 个答案:

答案 0 :(得分:8)

$first = $msgs->first(); // this does ->take(1) under the hood

现在您的构建器具有limit = 1子句。

所以基本上你需要这个:

// also you can use pluck:
$first = $msgs->pluck('created_at'); // returns first row`s single field
//then:
$ids = $msgs->take(9999)->lists('id'); // some high value depending on your data

您的解决方案并不是最好的,因为它会加载所有行并创建它们的对象,而您只需要列出一些ID。

你也可以使用Collection的first()方法来获取它的第一个项目,而不是那个foreach循环:

$messages = $msgs->get();
$first = $msgs->first()->created_at;

答案 1 :(得分:0)

我找到了解决方案:

        $msgs = Message::whereBetween('created_at', array($start, $end))                    
                            ->whereIn('advertiser_id', $array)            
                            ->orderBy('created_at', 'DESC');

        $messages = $msgs->get();
        foreach($messages as $message)
        {
            $first = $message->created_at;
            break;
        }               

非常容易。但我不知道这是否有效。