У меня есть 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 я вставлю, я получу все результаты для этого регистра, так как это представление по умолчанию для страницы.). Это заставляет меня думать, что, возможно, необработанный запрос не обрабатывается должным образом?