我的模型中有first_name
,mid_name
和last_name
个字段。我正在接收带有POST请求的2个字段(name
,last_name
)。我确信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(可能是因为我正在访问这个类?):
$query = User::class;
$lastnameQuery = $query->where('last_name', $request->last_name);
你会如何以一种干净的方式实现这样的场景?
答案 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
仅在orWhere
和first_name
上单独应用mid_name
,因此伪查询将是这样的:
WHERE last_name = 'doe' AND (first_name = 'john' OR mid_name = 'john')