Laravel雄辩:使用多个when()在多个动态条件下进行选择

问题描述 投票:0回答:1

我有这样的搜索功能:

public function search(Request $request)
    {
        $data = $request->all();
    $query = Member::select('members.*', 'profiles.belongs', 'profiles.position')
        ->leftJoin('profiles', 'members.id', '=', 'profiles.member_id');
    if (!empty($data['belongs'])) {
        $query->where('profiles.belongs', 'like', '%' . $data['belongs'] . '%');
    }
    if (!empty($data['user_id'])) {
        $query->where('members.user_id', '=', $data['user_id']);
    }
    if (!empty($data['name'])) {
        $query->where('members.last_name', 'like', '%' . $data['name'] . '%')
                ->orWhere('members.first_name', 'like', '%' . $data['name'] . '%');
    }
    $query->groupBy('members.id');
    switch ($request->field) {
        case 'belongs':
            $query->orderBy('profiles.' . $request->field, $request->type);
            break;
        case 'position':
            $query->orderBy('profiles.' . $request->field, $request->type);
            break;
        case 'name':
            $query->orderBy('members.last_name', $request->type);
            $query->orderBy('members.first_name', $request->type);
            break;
        default:
            $query->orderBy('members.' . $request->field, $request->type);
    }
        $members = $query->paginate($request->number_of_item);
        return $members;
    }

如您所见,此搜索功能有3个输入:user_id,所属和名称。我曾期望它可以作为AND条件使用,但使用“名称”输入则不能。我有3个这样的用户:

user_id      first_name      last_name       belongs
1            a               b               org1
2            c               b               org2
3            c               a               null

例如:如果我使用user_id = 1进行搜索,所属= org且名称= a,它将返回用户1和3(仅预期用户1)。我怎么了所有建议将不胜感激,非常感谢。

laravel eloquent
1个回答
0
投票

事实证明非常简单。我自己解决了这个问题:

$query->where('members.last_name', 'like', '%' . $data['name'] . '%')
                ->orWhere('members.first_name', 'like', '%' . $data['name'] . '%');

至:

$query->where(function($q) use ($data) {
                $q->where('members.last_name', 'like', '%' . $data['name'] . '%')
                    ->orWhere('members.first_name', 'like', '%' . $data['name'] . '%');
            });
© www.soinside.com 2019 - 2024. All rights reserved.