Php 在Laravel中搜索where子句或where子句
我有两种型号Php 在Laravel中搜索where子句或where子句,php,laravel,eloquent,Php,Laravel,Eloquent,我有两种型号公司和联系人搜索控制器,我的联系人型号类似: 类接触扩展模型{ 公共职能公司() { 返回$this->belongTomany('App\Company','Company\u contact','contact\u id','Company\u id'); } } 我的公司中很少有被称为客户的,我在其名称下有一个布尔字段is\u client 我想通过一个参数请求search来搜索联系人,该请求将联系人的名和姓与公司名进行比较。如果任何机构想拥有所有客户机的联系人列表,那么他们
公司
和联系人
搜索控制器,我的联系人型号类似:
类接触扩展模型{
公共职能公司()
{
返回$this->belongTomany('App\Company','Company\u contact','contact\u id','Company\u id');
}
}
我的公司中很少有被称为客户的,我在其名称下有一个布尔字段is\u client
我想通过一个参数请求search
来搜索联系人,该请求将联系人的
名和姓
与公司名
进行比较。如果任何机构想拥有所有客户机的联系人
列表
,那么他们可以传递一个额外的客户机
请求,因此我制作了一个类似这样的控制器:
Contact::当($request->client&&$request->search时,函数($q)使用($request){
$q->whereHas('companys',function($q)use($request){
$q->where('is_client',true)->where(函数($q)use($request){
$q->orWhere('name'、'like'、'%'。$request->search'%');
});
})->其中(函数($q)使用($request){
$q->orWhere('first_name','like','%'。$request->search'%'))
->或where('last_name','like','%.$request->search'%');
});
})->当($request->client==null&&$request->search时,函数($q)使用($request){
$q->where('first_name'、'like'、'%'。$request->search'%'))
->orWhere('last_name','like','%.$request->search'%'))
->或wherehas('companys',function($q)use($request){
$q->where('name'、'like'、'%'。$request->search'%');
});
})->当($request->client&&$request->search==null时,函数($q)使用($request){
$q->whereHas('companys',function($q)use($request){
$q->where('is_client',true);
});
})
->分页(30)
它可以很好地处理非客户联系人,对于客户联系人,初始列表看起来很好,但当我们键入某些内容时,它的行为不符合要求。我可能犯了一些逻辑错误。在这方面帮助我,或者指导我采取更好的方法 获取
客户端
和搜索
时的条件没有正确分组
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\u 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);
尝试
dd
您的SQL查询,查看查询中是否有错误。也许您必须将where子句封装在上层的where子句中。