2017-10-10 77 views
1

我有记录的ID。我需要查询记录之前更新的20个最新记录与id。Laravel雄辩地查询ID后的20条最新记录?

像这样的事情

$orders = Order::latest('updated_at')->take(20)->before(id)->get(); 

我使用laravel5.5

编辑

望着答案,我觉得我的问题是不够清晰。

说这是我的数据库表和身份证我已经是5

--------------------------------- 
|id| name | updated_at   | 
|--|------|---------------------| 
|1 |a  | 2017-09-21 06:27:59 | 
|2 |b  | 2017-09-19 06:20:29 | 
|3 |c  | 2017-09-12 05:27:59 | 
|4 |d  | 2017-09-18 05:17:39 | 
|5 |e  | 2017-09-17 06:27:48 | 
|6 |b  | 2017-09-19 06:27:59 | 
|7 |f  | 2017-09-04 06:27:58 | 
|8 |g  | 2017-09-06 06:27:14 | 

我想最近的更新记录,以便

--------------------------------- 
|id| name | updated_at   | 
|--|------|---------------------| 
|1 |a  | 2017-09-21 06:27:59 | 
|2 |b  | 2017-09-19 06:20:29 | 
|4 |d  | 2017-09-18 05:17:39 | 
|5 |e  | 2017-09-17 06:27:48 | 
|3 |c  | 2017-09-12 05:27:59 | 
|6 |b  | 2017-09-09 06:27:59 | 
|8 |g  | 2017-09-06 06:27:14 | 
|7 |f  | 2017-09-04 06:27:58 | 

现在20(在这种情况下,所有)记录与记录之前更新ID 5

--------------------------------- 
|id| name | updated_at   | 
|--|------|---------------------| 
|3 |c  | 2017-09-12 05:27:59 | 
|6 |b  | 2017-09-09 06:27:59 | 
|8 |g  | 2017-09-06 06:27:14 | 
|7 |f  | 2017-09-04 06:27:58 | 

这是我需要的结果。

+0

问题是什么?它工作吗? – Jite

+0

它不起作用。 '之前'不是一个真正的雄辩功能。我问是否有这样的功能。或者任何其他方式来达到此目的 – Ragas

+0

尝试按ID排序,然后限制它们为20. – Jite

回答

0

你可以使用这样的查询

select * from yourtable as t 
inner join (
    SELECT * FROM `yourtable` WHERE id = 590 
) as tm 
on t.updated_at < tm.updated_at order by t.updated_at desc 
limit 10 

用雄辩的ORM:

与您的ID替换590

$orders = Order::join(
     \DB::raw(
      '(select updated_at AS ddd from orders where id = 590) AS t'), 
     't.ddd', 
     '>', 
     'orders.updated_at' 
    )->latest('updated_at')->take(20)->get(); 
+0

你的小错误雄辩的代码从'latest'('updated_at','desc')中删除'desc'。即使在它之后它总是返回所有记录。 – Ragas

+0

我编辑,这个编辑是正确的,并且测试 – honarkhah

+0

谢谢。编辑后这是最好的解决方案,我的问题 – Ragas

0

怎么是这样的:

$id; 
$num = 20; 

$orders = Order::where('id', '<=', $id - $num) 
       ->orderBy('updated_at', 'desc') 
       ->take($num) 
       ->get(); 

$id; 
$range = 20; 
$query = []; 

foreach (range($id - $range, $id) as $idNumber) { 
    $query[] = $idNumber; 
} 

$orders = Order::find($query)->orderBy('updated_at', 'desc'); 

https://laravel.com/docs/5.5/eloquent

如果有机会,你在哪里做Laravel复杂的查询你想使用DB类https://laravel.com/docs/5.5/database#database-transactions

+0

这是而不是通过updated_at命令 – honarkhah

+0

错过了一个词,但使用了Laravel Eloquent。 – developernator

0

尝试这样的事情,看看它做你追求

$orders = Order::orderBy('updated_at', 'desc')->get(); 

$index = $orders->search(function (Order $order) { 
    return $order->id === 5; 
}); 

$orders = $orders->splice($index+1, 20); 
+0

这是错误的,返回所有命令从数据库到PHP – honarkhah

+0

谢谢这做了我想要的。 – Ragas

+0

对你的服务器下降的重量数据 – honarkhah