在 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`
和return所有模型都具有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 中,它 return 的效果很好。但是如何在 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();
Laravel8.x
的解决方案
User::withCount(['views as views_count' => function($query) {
$query->select(DB::raw('count(distinct(ip))'));
}])->get();
注意:不要使用'selectRaw'。
使用 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`
和return所有模型都具有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 中,它 return 的效果很好。但是如何在 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();
Laravel8.x
的解决方案User::withCount(['views as views_count' => function($query) {
$query->select(DB::raw('count(distinct(ip))'));
}])->get();
注意:不要使用'selectRaw'。