有时我们在Laravel
中使用这样的场景,如下所示:
if (!empty($request->input('user_name'))) {
$where[] = ['user_name', 'like', "%" . $request->input('user_name') . "%"];
}
if (!empty($request->input('group_id'))) {
$where[] = ['group_id', $request->input('group_id') ];
}
if (!empty($request->input('email'))) {
$where[] = ['email', 'like', "%" . $request->input('email') . "%"];
}
if (!empty($request->input('mobile'))) {
$where[] = ['mobile', 'like', "%" . $request->input('mobile') . "%"];
}
$users = User::where($where)->get();
但它太丑了,但我只想使用这个User::search($request->only(['user_name', 'email', 'mobile']));
,也许我们必须为输入名称的键名设计一些规则,你对这个条件有一些好主意吗?感谢。
答案 0 :(得分:6)
您可以创建local scope:
public function scopeSearch($q, $inputs)
{
$where = [];
foreach ($inputs as $key => $data) {
$where[] = [$key, 'like', "%".$data."%"];
}
return $q->where($where);
}
然后使用它:
User::search($request->only(['user_name', 'email', 'mobile']))->get();
答案 1 :(得分:1)
为了方便搜索,我稍微改进了它:
//use style
User::search(['eq'=>$request->only(['is_messaged', 'is_mailed', 'status']), 'like' => $request->only(['user_name', 'mobile'])]);
//the implement method
public function scopeSearch($query, $conditions)
{
$where = [];
foreach ($conditions as $key => $condition) {
if ($key == 'like') {
foreach ($condition as $whereKey => $whereValue) {
if ($whereValue == '') continue;
$where[] = [$whereKey, 'like', $whereValue."%"];
}
}
if ($key == 'eq') {
foreach ($condition as $whereKey => $whereValue) {
if ($whereValue == '') continue;
$where[] = [$whereKey, $whereValue];
}
}
}
return $query->where($where);
}
答案 2 :(得分:0)
你可以不循环地完成这项工作
$ string =' CASE WHEN'"。$ request-> input(' user_name')。"' !=''那么user_name喜欢"%"。'"。$ request->输入(' user_name')。"'。'。 34;%" 当$ request->输入时(' group_id')!=''那么group_id ='"。$ request->输入(' group_id')。"' 情况下'"。$ request->输入('电子邮件')。"' !=''然后发送电子邮件,例如"%"。'"。$ request->输入('电子邮件')。"'。&#39。 34;%" 情况下'"。$ request->输入(' mobile')。"' !=''那么移动就像"%"。'"。$ request->输入('移动')。"'。'。 34;%" &#39 ;;
$ users = User :: whereRaw($ string) - > get();