簡體   English   中英

在 Laravel 的 withCount() 方法中使用 DISTINCT

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

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