簡體   English   中英

雄辯的子查詢是否該行是最新的

[英]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 |
+---------+-----------+---------------------+

在這種情況下,如果請求的status1 ,則我不希望返回此行,因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM