laravel 查询生成器查询有啥问题?

Posted

技术标签:

【中文标题】laravel 查询生成器查询有啥问题?【英文标题】:What is wrong with laravel query builder query?laravel 查询生成器查询有什么问题? 【发布时间】:2019-03-29 23:07:47 【问题描述】:

我已经编写了一个查询来使用 laravel 查询生成器从 mysql 数据库中获取数据。看看下面给出的查询构建器代码:

$products = DB::table("products as p")
                ->select("p.*")
                ->join("product_tag as pt", "pt.p_id", "p.id")
                ->whereIn("pt.tag_name", function($q1) use($request)
                    $q1->from("user_questionnaire as uc")
                            ->select(DB::raw("distinct(at.prod_tag)"))
                            ->join("questionnaire_answers as qa", function($join)
                                $join->on("qa.question_id", "=", "uc.question_id")
                                        ->where("qa.answer_number", "=", "uc.answer_id");
                            )
                            ->join("answer_tags as at", "at.answer_id", "qa.id")
                            ->where("uc.user_id", $request->user_id);
                )->get();

当我登录此查询生成器时,我得到以下响应:

[
    
        "query": "select `p`.* from `products` as `p` inner join `product_tag` as `pt` on `pt`.`p_id` = `p`.`id` where `pt`.`tag_name` in (select distinct(at.prod_tag) from `user_questionnaire` as `uc` inner join `questionnaire_answers` as `qa` on `qa`.`question_id` = `uc`.`question_id` and `qa`.`answer_number` = ? inner join `answer_tags` as `at` on `at`.`answer_id` = `qa`.`id` where `uc`.`user_id` = ?)",
        "bindings": [
                  "uc.answer_id",
                  115
        ],
        "time": 0.43
    
]

现在,当我在 phpmyadmin 中运行此查询时,它会返回所需的结果。但是当 print_r $products 变量时,它显示空数组([])。

请建议我在查询生成器中做错了什么。

【问题讨论】:

uc.answer_id 被添加为绑定。因此,您的查询正在检查您的 qa.answer_number 是否与字符串 uc.answer_id 匹配,这可能不是您想要的。尝试将最里面的 ->where(...) 更改为另一个 ->on(...) 子句。 感谢 @Jonathan 它完美运行。 没问题,我添加了一个答案只是为了完整性:) 【参考方案1】:

您的问题是您使用->where() 将额外条件应用于您的最内层连接:

->where("qa.answer_number", "=", "uc.answer_id");

在这种情况下,第三个参数作为字符串绑定到查询中,因此您的数据库会将qa.answer_number 字段与字符串uc.answer_id 进行比较,这可能不是您想要的。当您执行 where 时,第 3 个(如果您省略运算符,则为第 2 个)将始终添加到查询绑定中,这就是导致此行为的原因。

要解决这个问题,您应该使用另一个 ->on(...) 向联接添加其他条件:

$join->on("qa.question_id", "=", "uc.question_id")
     ->on("qa.answer_number", "=", "uc.answer_id");

这将确保数据库将列与列进行比较,而不是列与值进行比较。

【讨论】:

不错的 @Jonathan。也谢谢你的解释。

以上是关于laravel 查询生成器查询有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

laravel,查询生成器,(或)查询未按预期工作

将 mysql 查询转换为 laravel 查询生成器

Laravel 查询生成器不在

如何使用 laravel 5 中的查询生成器从子查询中进行选择

Laravel 4 查询生成器加入数据库原始

laravel 查询生成器或在哪里