2014-03-13 87 views
0

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

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

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

我不想做一个foreach,因为我不希望有一个N+1 select issue

我不要计算在PHP中的数组,因为它是不是最佳(检索一切从DB只是做计数)

无的已经问的问题是令人满意的:

回答

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()); 

这会给你类似这样的东西(我在帖子中加入了文章mple):

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用于手机或循环的所有用户的第一个用户的数量。