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子句中。