[英]Eloquent sub-query for if the row is the latest one
我有以下子查詢:
->whereHas('statuses', function($query){
$query->where('status_id', request('status'));
})->orderBy(...)->paginate();
為了簡單起見,我隱藏了完整的查詢。 假設我有數據透視表user_status
。 用戶有很多狀態,一個狀態也可以有很多用戶(我知道這很不尋常。請以它為例)。 因此,當我如上所述查詢數據透視表user_status
,將獲得具有所請求狀態ID的那些行。 但是我還想添加約束,即該行必須是該特定用戶的最新行(而不是整個表)。 這是user_status表的外觀:
+---------+-----------+---------------------+
| user_id | status_id | created_at |
+---------+-----------+---------------------+
| 1 | 1 | 2018-09-03 18:39:14 |
| 1 | 8 | 2018-09-03 18:51:42 |
+---------+-----------+---------------------+
在這種情況下,如果請求的status
為1
,則我不希望返回此行,因為status_id
1不是user_id
1的最新行(請參見create_at
列中的時差)。
我該如何實現?
您可以通過對嵌套查詢使用其他條件來實現。
->whereHas('statuses', function($query){
$query->where('status_id', request('status'))
->whereIn('user_status.id', function($query) {
$query->selectRaw('MAX(id)')
->from('user_status')
->groupBy('user_id');
});
})->orderBy(...)->paginate();
嵌套查詢將僅選擇最新行(假設user_status.id為auto-increment
)
我在用戶模型中定義一個關系為:
public function latest_statuses() {
return $this->hasMany(Status::class,'user_id','id')->orderBy('created_at','DESC')->take(1);
}
在該書面查詢后為:-
$status = \App\User::with('latest_statuses')->whereHas('latest_statuses', function($query){
return $query->where('status_id', 1);
})->get();
這個對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.