2017-10-10 82 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