User
有很多Phone
个。我想从active
用户那里获得所有手机。我能做到:
$phones = [];
$users = User::with('phones')->where('active', 1)->get();
foreach($users as $user) {
$phones = array_merge($phones, $user->phones->toArray());
}
dd($phones); // <- Here are all the phones.
但我不确定它是更优雅或更好的方式。这种情况有内置的魔法功能吗?我是否可以从活动用户那里获得所有电话而无需编写循环并插入数组?
答案 0 :(得分:3)
您应该使用whereHas()
方法:
$phones = Phone::whereHas('user', function($q) {
$q->where('active', 1);
})->get();
答案 1 :(得分:1)
您还可以使用whereExists
,如果您不使用users表中的数据,这会更有效:
Phone::whereExists(function($query) {
$query->select(\DB::raw('NULL'))
->from('users')
->whereRaw('users.id = phones.user_id AND users.active = 1')
})->get();