Laravel - 选择与一个查询的关系

时间:2018-03-29 19:29:06

标签: laravel laravel-5 eloquent laravel-5.4 laravel-eloquent

我有一个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()为每个人创建一个新查询。如何避免这种情况并通过第一个查询获得所需的汽车数据?

3 个答案:

答案 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)

值得研究:laravel Eager Loading

以这种方式使用时,会出现查询关系数据。

示例:

Person::with('cars')->get();

此代码响应: 具有Person's Car数据的人员数据