【问题标题】:Search where clause orWhere clause in Laravel在 Laravel 中搜索 where 子句或 Where 子句
【发布时间】:2019-08-19 08:27:51
【问题描述】:

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

class Contact extends Model {

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

}

我的少数公司被称为客户,我在 is_client 的名称下有一个布尔字段。

我想通过参数请求 search 搜索联系人,该请求将 contact's first_namelast_namecompany name 进行比较。如果任何机构想要拥有所有clientcontact 列表,那么他们可以传递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)

它对非客户联系人工作得很好,对于客户联系人来说,初始列表看起来很好,但是当我们输入一些东西时,它的行为并不像我们想要的那样。我可能在做一些逻辑错误。在这方面帮助我或指导我更好的方法。

【问题讨论】:

  • 尝试dd您的SQL查询,看看您的查询是否有错误。也许你必须将你的 where 子句封装在上层 where 子句中。

标签: php laravel eloquent


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2020-11-28
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多