[英]Use DISTINCT in Laravel's withCount() method
使用 Laravel/Lumen eloquent 我可以得到這樣的計數關系:
User::withCount('views')->get();
這將使用 SQL
select `users`.*, (select count(*) from `views` where `users`.`id` = `views`.`user_id`) as `views_count` from `users`
並返回所有帶有 views_count 屬性的模型,太好了。
但我需要將這些視圖計入唯一 IP 列。 在這個查詢中,我可以簡單地將 count(*) 替換為 count(DISTINCT ip),如下所示:
select `users`.*, (select count(DISTINCT ip) from `views` where `users`.`id` = `views`.`user_id`) as `views_count` from `users`
並在 phpMyAdmin 中返回良好的結果。 但是如何在 Laravel eloquent 中實現這一點呢? 我找不到任何方法來使用自定義列進行計數。 我可以通過這樣的查詢函數傳遞數組:
User::withCount(['views' => function ($q) { // what there? }])->get();
但現在我只能通過 where 條件,不能以任何方式使用 Distinct。
我知道我可以先獲取模型,然后使用 distinct 和 count 或 groupby 進行 foreach,但我需要保持這個單一的查詢,快速而簡單。 如果我可以在原始 SQL 中輕松實現這一點,那么我也應該在 Laravel 中以某種方式做到這一點。 如果需要,我可以使用一些自定義的 eloquent 方法,因為我將在應用程序的許多地方使用這個唯一計數。
這么短的問題 - 如何結合 withCount 和 Distinct?
PS我還嘗試在模型的關系級別(在hasMany上)上使用distinct或groupBy,但這不起作用。
User::withCount('views', function($query) {
$query->select(DB::raw('count(distinct(ip))'));
})->get();
Laravel 8.x 的解決方案
User::withCount(['views as views_count' => function($query) {
$query->select(DB::raw('count(distinct(ip))'));
}])->get();
注意:不要使用selectRaw
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.