【问题标题】:Laravel - select with relationship with one queryLaravel - 选择与一个查询的关系
【发布时间】:2018-09-08 20:41:23
【问题描述】:

我有一个 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
    } 
}

$persons 是通过一个查询获得的,但在 foreach 循环中 $person->cars()->get() 会为每个人创建一个新查询。如何避免这种情况并通过第一次查询获得所需的汽车数据?

【问题讨论】:

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


    【解决方案1】:

    问题出在cars()

    使用下面给出的sn-p

    foreach ($persons as $person) {
         foreach($person->cars as $car) 
           { 
             print $person->name . " has a " . $car->mark . $car->model
            } 
          }
    

    当您执行cars() 时,它指的是执行另一个查询的模型。但是当你使用cars 时,它只指已经加载的集合。

    希望对你有帮助

    【讨论】:

    • 我目前正在使用移动应用程序,所以忘记代码缩进。
    • 主要问题是我需要用过滤器添加 with(),因为我根本没有加载汽车。但第二部分确实是我使用了 cars() 所以你的回答也是正确的并且有帮助。谢谢! :)
    • @user1985273 是的,你必须使用with()
    【解决方案2】:

    您必须将mark 过滤器添加到whereHas()with()

    $persons = Person::whereHas('cars', function ($query) {
        $query->where('mark', 'ford');
    })->with(['cars' => function($query) {
        $query->where('mark', 'ford');
    }])->get();
    

    【讨论】:

    • 需要补充一点的是,当使用上述whereHas 时,只有Persons 与福特才会出现在结果集合中。而且查询只会急切地为这些人加载相关的福特汽车。如果你想为他们加载所有汽车,而不仅仅是福特,你应该从with语句中删除子查询,只使用with('cars')
    • 这就是 OP 所要求的。
    • 实际上,他并没有说明他只想要福特品牌的汽车,而只想要拥有福特的人。然而我同意,很可能他是指你写的。并且请不要将我的评论视为批评,这只是它可能关注的任何人的附加信息。 :)
    • 他在stackoverflow.com/a/49564111/4848587的评论中指定了它;-)
    【解决方案3】:

    值得研究:laravel Eager Loading

    当以这种方式使用时会进来查询关系数据。

    例子:

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

    此代码响应: 个人数据和个人汽车数据

    【讨论】:

    • 谢谢,这确实给了我一个查询的结果,但是如果我尝试迭代 $person->cars 集合有所有的汽车,而不仅仅是我期望的福特。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多