Laravel 5.1 - 查询多个关系

时间:2015-09-11 01:49:52

标签: eloquent laravel-5.1

我遇到了一个我不知道如何解决的问题。 我的公司有个人资料(个人资料属于公司)并且有地点(公司有很多地方)。

我试图让所有公司名称为$request->input('search_term'),并且至少有一个地方的邮政编码或城市匹配$request->input('search_addition'),且个人资料的类型为0。 / p>

我的代码是:

$companies = Company::with(['profile' => function ($query) {
                    $query->where('type', 0);

                }])
                ->whereHas('locations', function ($query) use ($request) {
                    $query->where('zip', 'like', '%'.$request->input('search_addition').'%')
                          ->orWhere('city', 'like', '%'.$request->input('search_addition').'%');
                })
                ->where('name', 'like', '%'.$request->input('search_term').'%');

最后,我添加$companies = $companies->paginate(25);

我得到的结果不是我想要的。我得到所有名称为$request->input('search_term')的公司。它忽略了配置文件的类型和位置。对于那些与指定的search_addition不匹配但仍会返回公司的公司,locations数组为空。

1 个答案:

答案 0 :(得分:0)

with()用于带有或不带约束的关系预先加载,不用作过滤父模型的约束,而是需要使用where函数系列。

这就是我认为代码应该是(未经过测试)。

$companies = Company::with('profile')
    ->with(['locations' => function ($query) use ($request) {
        $query->where('zip', 'like', '%'.$request->input('search_addition').'%')
            ->orWhere('city', 'like', '%'.$request->input('search_addition').'%');
    }])
    ->whereHas('profile', function ($query) {
        $query->where('type', 0);
    })
    ->whereHas('locations', function ($query) use ($request) {
        $query->where('zip', 'like', '%'.$request->input('search_addition').'%')
            ->orWhere('city', 'like', '%'.$request->input('search_addition').'%');
    })
    ->where('name', 'like', '%'.$request->input('search_term').'%');