在查询构建器上评估两个字段的最干净的方法是什么
What is the cleanest way to evaluate both fields on query builder
我的模型中有 first_name
、mid_name
和 last_name
字段。我收到 2 个字段(name
、last_name
)和 POST 请求。我确定 last_name
肯定会在那里,但我希望能够将 first_name
或 mid_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(可能是因为我正在访问 class?):
$query = User::class;
$lastnameQuery = $query->where('last_name', $request->last_name);
您将如何处理这样的场景以干净利落的方式实现它?
使用 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
,只在first_name
和mid_name
上单独应用orWhere
,所以伪查询是这样的:
WHERE last_name = 'doe' AND (first_name = 'john' OR mid_name = 'john')
我的模型中有 first_name
、mid_name
和 last_name
字段。我收到 2 个字段(name
、last_name
)和 POST 请求。我确定 last_name
肯定会在那里,但我希望能够将 first_name
或 mid_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(可能是因为我正在访问 class?):
$query = User::class;
$lastnameQuery = $query->where('last_name', $request->last_name);
您将如何处理这样的场景以干净利落的方式实现它?
使用 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
,只在first_name
和mid_name
上单独应用orWhere
,所以伪查询是这样的:
WHERE last_name = 'doe' AND (first_name = 'john' OR mid_name = 'john')