連接查詢我有users
和activities
之間一比一的關係,使得每個用戶都有一個last_activity_id
映射到一個特定的行中activities
。獲取一個約束的計數,在Laravel的查詢生成器
我需要能夠根據上一次活動中列的值來過濾用戶列表。爲了能夠做更多的事情如分頁,這必須在查詢本身完成,所以我無法獲取結果,然後在事實之後應用過濾器。因此,我用一個select
有leftJoin
一起帶來的相關列直接進入我的結果集:
$query = User::select(
'users.*',
'activities.description as last_activity_description')
->leftJoin('activities', 'activities.id', '=', 'users.last_activity_id')
->having('last_activity_description', 'like', "%blanchin%");
這似乎做工精細,我可以打電話$query->get()
得到過濾後的結果集。它生成一個查詢,看起來像:
select `users`.*,
`activities`.`description` as `last_activity_description`
from `users`
left join `activities` on `activities`.`id` = `users`.`last_activity_id`
having `last_activity_description` like '%blanchin%'
但是,如果我嘗試再得到這樣的結果通過調用$query->count()
設置計數,Laravel生成此(失敗)查詢:
select count(*) as aggregate
from `users`
left join `activities` on `activities`.`id` = `users`.`last_activity_id`
having `last_activity_description` like '%blanchin%'
看起來呼叫count()
已刪除了我原來的select
子句並將其替換爲select count(*) as aggregate
,這意味着我的having
子句失敗,因爲last_activity_description
別名不再定義。
我該如何解決這個問題?
即使這樣,我仍然需要'leftJoin'來約束基於'last_activity_id'。 – alexw
如果您在用戶模型中定義了「activities()」關係,則不適用。 Laravel的關係將爲你做到這一點。我更新了我的答案以證明這一點。 –