为了账号安全,请及时绑定邮箱和手机立即绑定

在 Laravel 中搜索 where 子句 orWhere 子句

在 Laravel 中搜索 where 子句 orWhere 子句

PHP
慕后森 2021-11-26 19:58:15
我有两个模型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)它与非客户联系人一起工作得很好,对于客户联系人初始列表看起来很好,但是当我们输入某些内容时,它的行为并不符合预期。我可能在做一些逻辑错误。帮助我解决这个问题或指导我更好的方法。
查看完整描述

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

您获得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);


查看完整回答
反对 回复 2021-11-26
  • 1 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信