You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:15:03