SQL запрос к Laravel построителю запросов - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть 2 таблицы

risks

risk_id    name    area_id
1          a       1
2          b       1

risk_areas

id         name    parent_id
1          a       0
2          b       1
3          c       1
4          d       2

Это мой sql запрос:

SELECT * FROM `risks` WHERE (`register_id` = 29 AND `area_id` = 1) 
OR (`area_id` IN (SELECT id FROM risk_areas WHERE parent_id = 1) AND `register_id` = 29 ) 
OR (`area_id` IN (SELECT id FROM risk_areas WHERE parent_id IN (SELECT id FROM risk_areas WHERE parent_id = 1)) AND `register_id` = 29 ) 

При запуске в phpMyAdmin запрос работает как положено.

I я пытался внедрить его в Laravel с помощью построителя запросов. Он извлекает риск из определенного регистра (я использовал 29 для примера), а также находит все его дочерние риски (может быть только до 3 поколений, например parent-> child-> child)

Я изначально попробовал это:

$query-> raw("
    SELECT * FROM `risks` WHERE (`register_id` = " . $q['register_id'] . "  AND `area_id` = ".$q['area_id'].") 
    OR (`area_id` IN (SELECT id FROM risk_areas WHERE parent_id = ".$q['area_id'].") AND `register_id` = " . $q['register_id'] . " ) 
    OR (`area_id` IN (SELECT id FROM risk_areas WHERE parent_id IN (SELECT id FROM risk_areas WHERE parent_id = ".$q['area_id'].")) AND `register_id` =  " . $q['register_id'] . " ) 
");

$q['register_id'] извлекает register_id и $q['area_id'] правильно выбирает area_id.

Так как это не сработало (просто вывел родители и даже те, у кого один и тот же area_id, но разные идентификаторы регистра) Я пробовал это:

$query
    ->where('area_id', $q['area_id'])
    ->orWhere('area_id','IN',  function ($query) use($q) {
        $query->where('parent_id',$q['area_id'])
            ->where('register_id',$q['register_id']);
    })
    ->orWhere('area_id','IN',  function ($query) use($q) {
        $query->where('parent_id','IN', function ($query) use($q) {
            $query->where('parent_id',$q['area_id']);
        })
        ->where('register_id',$q['register_id']);
    })
    ->where('register_id',$q['register_id']);

Но это было так же, как в первом. Моя третья попытка:

$query
    ->where('area_id', $q['area_id'])
    ->orWhere('area_id','IN',  function ($query) use($q) {
        $query->DB::table('risk_areas')
            ->select(DB::raw('id'))
            ->where('parent_id',$q['area_id'])
            ->where('register_id',$q['register_id']);
    })
    ->orWhere('area_id','IN',  function ($query) use($q) {
        $query->DB::table('risk_areas')
            ->select(DB::raw('id'))
            ->where('parent_id','IN', function ($query) use($q) {
                $query->DB::table('risk_areas')
                    ->select(DB::raw('id'))
                    ->where('parent_id',$q['area_id']);
            })
            ->where('register_id',$q['register_id']);
    })
    ->where('register_id',$q['register_id'])->get();

Но это то же самое, что и первая. Как мне повторить запрос sql?

РЕДАКТИРОВАТЬ:

Каждый регистр имеет свой register_id (это используется только для ужесточения поиска).

Каждый регистр содержит много рисков.

У каждого риска может быть только одна зона риска.

Я получаю одни и те же результаты каждый раз, независимо от того, используете ли вы необработанный запрос sql или используете конструктор запросов.

Единственный раз, когда я получал другие (и правильные) результаты, это когда я подавал запрос в phpmyadmin (поэтому я хочу повторить рабочий запрос в своем коде).

Все переменные имеют правильные значения, как я проверял с помощью dd ().

Я думаю, причина в том, что мой синтаксис в построителе запросов неверен, поэтому я спрашиваю, как преобразовать мой sql запрос в построитель запросов laravel.

EDIT 2 :

Исходный запрос выводит все риски для определенного c регистра (все отображаемые риски принадлежат этому регистру). Когда я жестко кодирую значения в необработанном запросе, я получаю тот же результат (независимо от того, какую комбинацию register_id / area_id я вставлю, я получу все результаты для этого регистра, так как это представление по умолчанию для страницы.). Это заставляет меня думать, что, возможно, необработанный запрос не обрабатывается должным образом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...