Laravel 8中如何编写含动态数量orWhere条件的Eloquent查询
错误原因
- 对Laravel查询构造器的数组传参逻辑理解有误:当你向
orWhere传入多维条件数组时,数组内的所有条件会自动用AND拼接,而非你预期的OR。你传入的条件最终生成的SQL等价于SELECT * FROM tags WHERE (name = 'php' AND name = 'mysql' AND name = 'laravel'),单个字段不可能同时匹配多个值,自然返回空结果。 - 获取用户的代码存在语法错误,且查询逻辑不合理:
User::with('tags')-where缺少箭头符号,且用get()返回的是用户集合,无法直接取tags关联,应该用first()获取单个用户实例。
最优解决方案
你的需求是匹配name在指定值列表内的记录,直接使用whereIn方法即可,完全不需要手动拼接OR条件:
// 正确获取当前用户及其关联标签 $user = User::with('tags')->where('id', Auth::user()->id)->first(); // 提取标签名数组 $tagNames = $user->tags->pluck('name')->all(); $tags = Tag::with([ 'questions.answers', 'questions.user.answers', 'questions.tags' ]) ->whereIn('name', $tagNames) ->get();
动态拼接OR条件的通用方案
如果后续你的查询条件不止是name等于固定值的场景,需要动态生成多个OR条件,可以用闭包分组查询实现:
$conditions = $user->tags->map(function ($item) { return ['name', '=', $item->name]; })->all(); $tags = Tag::with([ 'questions.answers', 'questions.user.answers', 'questions.tags' ]) ->where(function ($query) use ($conditions) { foreach ($conditions as $condition) { $query->orWhere(...$condition); } }) ->get();
以上写法生成的SQL才会是你预期的WHERE (name = ? OR name = ? OR name = ?)逻辑。
内容的提问来源于stack exchange,提问作者Michael Cook
相关产品推荐
相关产品推荐

