Laravel关系:检索一对多的计数

时间:2014-03-13 11:05:22

标签: laravel count one-to-many eloquent

我有一个案例,我想从一个表(我的所有用户)加载所有元素,并看看他们有多少手机。我知道可以加载所有手机,但这会导致太大的查询。我怎样才能加载手机的数量,而不是他们的内容。

我当前的代码(工作,但检索的结果太大)

$users= User::get();
$users->load('phones');

我不想做一个foreach,因为我不想要N+1 select issue

我不想在PHP中计算数组,因为它不是最佳的(从数据库中检索所有内容以进行计数)

所有已提问的问题都不令人满意:

1 个答案:

答案 0 :(得分:2)

您可以尝试使用user.idPK)& 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用于第一个用户的手机数量或循环所有用户。