我有两个模型Company和Contact搜索控制器,我的 Contact 模型看起来像:
class Contact extends Model {
public function companies()
{
return $this->belongsToMany('App\Company', 'company_contact', 'contact_id', 'company_id');
}
}
我的公司很少被称为客户,我在名称下有一个布尔字段is_client。
我要搜索通过PARAM请求联系人search进行比较contact's first_name,并last_name用也company name。如果任何机构想要拥有contact所有列表,client那么他们可以传递一个额外的请求,client因此我制作了一个这样的控制器:
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->orWhere('name', 'like', '%'. $request->search . '%');
});
})->where(function ($q) use ($request) {
$q->orWhere('first_name', 'like', '%'.$request->search.'%')
->orWhere('last_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)
它与非客户联系人一起工作得很好,对于客户联系人初始列表看起来很好,但是当我们输入某些内容时,它的行为并不符合预期。我可能在做一些逻辑错误。帮助我解决这个问题或指导我更好的方法。
心有法竹