我有一个案例,我想从一个表(我的所有用户)加载所有元素,并看看他们有多少手机。我知道可以加载所有手机,但这会导致太大的查询。我怎样才能加载手机的数量,而不是他们的内容。
我当前的代码(工作,但检索的结果太大)
$users= User::get();
$users->load('phones');
我不想做一个foreach,因为我不想要N+1 select issue
我不想在PHP中计算数组,因为它不是最佳的(从数据库中检索所有内容以进行计数)
所有已提问的问题都不令人满意:
答案 0 :(得分:2)
您可以尝试使用user.id
(PK
)& phones.user_id
:
$users = User::join('phones', 'users.id', '=', 'phones.user_id')
->groupBy('phones.user_id')
->select('users.*', 'phones.*', DB::raw('count(phones.user_id) countOfPhones'))
->get();
// Check the output
dd($users->toArray());
这会给你这样的东西(我在这个例子中加入了帖子):
array (size=4)
0 =>
array (size=14)
'id' => int 1
'first_name' => string 'Sheikh' (length=6)
// ...
'countOfPosts' => int 7 // <-- count of phones in your case
1 =>
array (size=14)
'id' => int 2
'first_name' => string 'Muhammed' (length=8)
'last_name' => string 'Usman' (length=5)
// ...
'countOfPosts' => int 2 <-- count of phones in your case
因此,请将$users->first()->countOfPhones
用于第一个用户的手机数量或循环所有用户。