Что не так с запросом построителя запросов laravel? - PullRequest
0 голосов
/ 25 октября 2018

Я написал запрос для извлечения данных из базы данных MySQL, используя построитель запросов laravel.Посмотрите на код построителя запросов, приведенный ниже:

$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 отображает пустой массив ([]).

Пожалуйста, подскажите, что я делаю неправильно в построителе запросов.

1 Ответ

0 голосов
/ 25 октября 2018

Ваша проблема в том, что вы используете ->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");

Это позволит убедиться, что база данных сравнивает столбцы со столбцами, а не столбцы со значениями.

...