我有一个Laravel预订应用程序,但我正在为客户做一些手动报告。
我有一个在SequelPro中运行的SQL查询:
SELECT t.name
, t.email
, t.trial_ends_at
,
FROM teams t
ORDER
BY t.trial_ends_at DESC
但是,我现在要做的是在每一行中添加另一个字段,显示该团队的客户端数量。
团队客户的关系是:
用户可以预订很多, 预订属于用户, 预订有一个team_id字段
我希望将用户数量附加到他们至少预订过该团队ID的位置。
在Laravel的雄辩中,我会这样做:
return User::whereHas('bookings', function($q) {
$q->where('team_id', THE ID)
})->count();
答案 0 :(得分:2)
加入查找计数的子查询:
SELECT
t.name,
t.email,
t.trial_ends_at,
COALESCE(b.cnt, 0) AS client_cnt
FROM teams t
LEFT JOIN
(
SELECT team_id, COUNT(*) AS cnt
FROM bookings
GROUP BY team_id
) b
ON t.id = b.team_id -- this assumes that id joins to team_id
ORDER BY
t.trial_ends_at DESC;
您有以下要求:
我希望将用户数量附加到他们至少预订过该团队ID的位置。
在我看来,如果有与该记录关联的预留,则用户只会出现在bookings
表中的记录中。换句话说,我认为我们不需要对此要求进行任何额外检查,因为如果用户确实出现了,那么默认情况下他已经出现过一次。
答案 1 :(得分:0)
如果您的第一个查询产生$teams
,那么您可以执行类似 -
foreach($teams as $team){
$userCount = User::whereHas('bookings', function($q) use($team){
$q->where('team_id', $team->id);
})->count();
if($userCount>0){
$team->userCount = $userCount;
}
}
如果您在userCount
个集合中有多个booking
,则会追加$teams
,否则不会。{/ p>