在查询构建器上评估这两个字段的最简洁方法是什么

时间:2018-06-15 01:23:12

标签: laravel laravel-5 model laravel-query-builder

我的模型中有first_namemid_namelast_name个字段。我正在接收带有POST请求的2个字段(namelast_name)。我确信last_name肯定会在那里,但我希望能够将first_namemid_name与名称进行比较。

这里的问题是,我不想重复自己,但我无法找到更清洁的方式。

$query = User::where('last_name', $request->last_name);

if ($request->name) {
    $query = $query->where('first_name', $request->name);
}

$result = $query->get();

如果我在if语句中链接->orWhere('mid_name', $request->name),我将重复自己重新检查last_name。

我尝试划分这一行:

$query = User::where('last_name', $request->last_name);

这个但是它甚至找不到last_name(可能是因为我正在访问这个类?):

$query = User::class;
$lastnameQuery = $query->where('last_name', $request->last_name);

你会如何以一种干净的方式实现这样的场景?

1 个答案:

答案 0 :(得分:1)

使用orWhere可以轻松完成,例如:

$query = User::where('last_name', $request->last_name);

if ($request->name) {
    $query = $query->where(function($query) use ($request) {
        $query->where('first_name', $request->name)
              ->orWhere('mid_name', $request->name);
    });
}

$result = $query->get();

此处需要closure仅在orWherefirst_name上单独应用mid_name,因此伪查询将是这样的:

WHERE last_name = 'doe' AND (first_name = 'john' OR mid_name = 'john')