我有一个Person模型。每个人可能拥有零辆或多辆汽车:
class Person extends Model
{
public function cars()
{
return $this->hasMany('App\Car');
}
}
我希望选择并显示所有拥有一个正在运行的查询的福特的人。所以我试过这个:
$persons = Person::whereHas('cars', function ($query) {
$query->where('mark', 'ford');
})->get();
foreach ($persons as $person) {
foreach($person->cars()->get() as $car) {
print $person->name . " has a " . $car->mark . $car->model
}
}
$ people获得了一个查询,但在foreach循环中$ person-> cars() - > get()为每个人创建一个新查询。如何避免这种情况并通过第一个查询获得所需的汽车数据?
答案 0 :(得分:1)
您必须将mark
过滤条件添加到whereHas()
和with()
:
$persons = Person::whereHas('cars', function ($query) {
$query->where('mark', 'ford');
})->with(['cars' => function($query) {
$query->where('mark', 'ford');
}])->get();
答案 1 :(得分:1)
问题出在cars()
使用以下给定的代码段
foreach ($persons as $person) {
foreach($person->cars as $car)
{
print $person->name . " has a " . $car->mark . $car->model
}
}
当你做cars()
时,它指的是执行另一个查询的模型。但是当你使用cars
时,它只引用已经加载的集合。
希望这有帮助
答案 2 :(得分:0)
以这种方式使用时,会出现查询关系数据。
示例:
Person::with('cars')->get();
此代码响应: 具有Person's Car数据的人员数据