繁体   English   中英

在Laravel中搜索where子句或Where子句

[英]Search where clause orWhere clause in Laravel

我有两个模型CompanyContact搜索控制器,我的Contact模型看起来像:

class Contact extends Model {

    public function companies()
    {
        return $this->belongsToMany('App\Company', 'company_contact', 'contact_id', 'company_id');
    }

}

在我的公司中,很少有人将其称为is_client的布尔字段的is_client

我想通过参数请求search来搜索联系人,该请求还将contact's first_namelast_namecompany name 如果有人希望拥有所有client contact列表,那么他们可以传递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)

对于非客户联系人,它工作得很好,对于客户联系人,初始列表似乎很好,但是当我们键入某些内容时,它的行为就不符合要求。 我可能在做一些逻辑错误。 帮助我解决这个问题,或指导我采取更好的方法。

获取clientsearch条件未正确分组

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM