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

时间:2019-07-06 13:40:32

标签: php mysql laravel eloquent lumen

凭借Laravel / Lumen的雄辩,我可以获得这样的计数关系:

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(DISTINCT ip)替换count(*):

select `users`.*, (select count(DISTINCT ip) from `views` where `users`.`id` = `views`.`user_id`) as `views_count` from `users`

并在phpMyAdmin中返回良好的结果。但是如何在Laravel中雄辩地做到这一点呢?我找不到任何使用自定义列进行计数的方法。我可以通过带有查询功能的数组传递这样的信息:

User::withCount(['views' => function ($q) { // what there? }])->get();

但是现在我只能在有条件的地方通过,而不能以任何方式使用Distinct。

我知道我可以先获得模型,然后使用不重复和计数或分组依据进行foreach,但我需要保持此单个查询的快速和简单。如果我可以轻松地在原始SQL中实现这一点,那么我也应该以某种方式在Laravel中做到这一点。 如果需要,我可以使用一些自定义的雄辩方法,因为我将在应用程序的许多地方使用此唯一计数。

这么简短的问题-如何与count和Distinct相结合?

PS我还尝试在模型的关系级别(在hasMany上)上使用distinct或groupBy,但这不起作用。

1 个答案:

答案 0 :(得分:1)

ActiveWorkbook.Name