2016-12-26 34 views
0

連接查詢我有usersactivities之間一比一的關係,使得每個用戶都有一個last_activity_id映射到一個特定的行中activities獲取一個約束的計數,在Laravel的查詢生成器

我需要能夠根據上一次活動中列的值來過濾用戶列表。爲了能夠做更多的事情如分頁,這必須在查詢本身完成,所以我無法獲取結果,然後在事實之後應用過濾器。因此,我用一個selectleftJoin一起帶來的相關列直接進入我的結果集:

$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別名不再定義。

我該如何解決這個問題?

回答

1

似乎解決方法是不在我的約束中使用別名,而只是使用實際的表和列名稱。這只是正常:

$query = User::select(
      'users.*', 
      'activities.description as last_activity_description') 
     ->leftJoin('activities', 'activities.id', '=', 'users.last_activity_id') 
     ->where('activities.description', 'like', "%blanchin%") 
     ->count(); 

還要注意,在having條款需要更改爲where條款。

0

爲什麼不使用關係約束和分頁?

User::whereHas('activities', function($query) use ($description) { 
    return $query->where('description', 'LIKE', "%$description%"); 
})->paginate($results); 

如果你想要回活動描述得那麼:

User::whereHas('activities', function($query) use ($description) { 
    return $query->where('description', 'LIKE', "%$description%"); 
})->with(['activities' => function($query) use ($description) { 
    return $query->select('id', 'description as last_activity_description') 
     ->where('description', 'LIKE', "%$description%"); 
}])->paginate($results); 

UPDATE

上述工作與你的用戶模型中定義的activities()關係:

public function activities() 
{ 
    return $this->belongsTo(Activity::class, 'last_activity_id'); 
} 
+0

即使這樣,我仍然需要'leftJoin'來約束基於'last_activity_id'。 – alexw

+0

如果您在用戶模型中定義了「activities()」關係,則不適用。 Laravel的關係將爲你做到這一點。我更新了我的答案以證明這一點。 –