我遇到了一个我不知道如何解决的问题。 我的公司有个人资料(个人资料属于公司)并且有地点(公司有很多地方)。
我试图让所有公司名称为$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数组为空。
答案 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').'%');