我有两个模型Company
和Contact
搜索控制器,我的联系人模型如下所示:
class Contact extends Model {
public function companies()
{
return $this->belongsToMany('App\Company', 'company_contact', 'contact_id', 'company_id');
}
}
我很少有公司被称为客户,我在is_client
名称下有一个布尔字段。
我想通过参数请求search
搜索联系人,该请求将contact's
first_name
和last_name
也与company name
进行比较。如果有人希望拥有所有contact
的{{1}}列表,那么他们可以传递一个额外的client
请求,因此我相应地选择了一个控制器:
client
对于非客户联系人,它工作得很好,对于客户联系人,初始列表似乎很好,但是当我们键入某些内容时,它的行为并不理想。我可能在做一些逻辑错误。帮助我解决这个问题,或指导我采取更好的方法。
答案 0 :(得分:1)
您获得client
和search
的条件未正确分组
Contact::when($request->client && $request->search, function ($q) use($request) {
$q->whereHas('companies', function ($q) use ($request) {
$q->where('is_client', true);
})->where(function ($q) use ($request) {
$q->where('first_name', 'like', '%'.$request->search.'%')
->orWhere('last_name', 'like', '%'.$request->search.'%')
->orWhereHas('companies', function ($q) use ($request) {
$q->where('name', 'like', '%' . $request->search . '%');
});
});
})->when($request->client == null && $request->search, function ($q) use($request) {
$q->where('first_name', 'like', '%'.$request->search.'%')
->orWhere('last_name', 'like', '%'.$request->search.'%')
->orWhereHas('companies', function ($q) use ($request) {
$q->where('name', 'like', '%' . $request->search . '%');
});
})->when($request->client && $request->search == null, function ($q) use ($request) {
$q->whereHas('companies', function ($q) use ($request) {
$q->where('is_client', true);
});
})
->paginate(30)
条件is_client
必须与条件search
分开
您应该已经注意到,您可以在此处轻松收缩代码
$contactQuery = Contact::query();
if ($request->client) {
$contactQuery->whereHas('companies', function ($q) {
$q->where('is_client', true);
});
}
if ($request->search) {
$contactQuery->where(function ($q) use ($request) {
$q->where('first_name', 'like', '%'.$request->search.'%')
->orWhere('last_name', 'like', '%'.$request->search.'%')
->orWhereHas('companies', function ($q) use ($request) {
$q->where('name', 'like', '%' . $request->search . '%');
});
});
}
$contacts = $contactQuery->paginate(30);