Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
sqlSELECT * FROM gates LEFT JOIN drivers LEFT JOIN device_types ON drivers.id = device_types.driver_id ON gates.gate_type_id = drivers.gate_type_id WHERE device_types.id = 11 AND gates.system_id = 6;
Никак не могу сообразить как его написать с использованием конструктора запросов PHPFluent
Перепробовал кучу различных вариантов, ничего не сработало… чувствую что где то нужно использовать PHPDB::row()
, но как не пойму. Кто либо писал подобные запросы?
Не в сети
Не в сети
- Именно Fluent или Eloquent? Зачем тебе Fluent?
Потому что мне точно известно, что Fluent использует подготовленный запросы и защищен от SQL-инъекций. И насколько мне известно Eloquent и Fluent используют различные Query классы. Если ошибаюсь, пожалуйста поправьте.
Что касается запроса, то так я пробовал:
Gate::join('drivers', 'drivers.id', '=', 'device_types.driver_id')
->join('device_types', 'gates.gate_type_id', '=', 'drivers.gate_type_id')
->where('device_types.id', '=', 11)
->where('gates.system_id', '=', 6)
->get();
Gate::left_join('drivers', 'drivers.id', '=', 'device_types.driver_id')
->left_join('device_types', 'gates.gate_type_id', '=', 'drivers.gate_type_id')
->where('device_types.id', '=', 11)
->where('gates.system_id', '=', 6)
->get();
sqlSQLSTATE[42S22]: Column not found: 1054 Unknown column 'device_types.driver_id' in 'on clause' SQL: SELECT * FROM `gates` INNER JOIN `drivers` ON `drivers`.`id` = `device_types`.`driver_id` INNER JOIN `device_types` ON `gates`.`gate_type_id` = `drivers`.`gate_type_id` WHERE `device_types`.`id` = ? AND `gates`.`system_id` = ? Bindings: array ( 0 => 11, 1 => 6, )
На мой взгляд проблема заключается в том, что сначала нужно передать две таблицы для связывание, а уже затем задавать аргументы для ON критериев, только вот как это сделать?
Не в сети
- Потому что мне точно известно, что Fluent использует подготовленный запросы и защищен от SQL-инъекций.
Тоже самое относится к Eloquent — это надстройка над Fluent, даёт возможность работать с моделями и использовать связи, активную загрузку и пр. Впрочем, в твоём случае это всего лишь запрос и связей нет, поэтому Eloquent == Fluent.
Для справки: в MySQL не имеет (или почти не имеет) значения, где передаются условия. Использование ON — синтаксический сахар; ничего не изменится, если ты передашь все условия в одном WHERE. Свою догадку можешь проверить, перенеся одно или оба ON.
Не в сети
Странно, почему я этого сразу не понял, но запрос приведенный мной выше равносилен этому:
sqlSELECT * FROM gates LEFT JOIN drivers ON gates.gate_type_id = drivers.gate_type_id LEFT JOIN device_types ON drivers.id = device_types.driver_id WHERE device_types.id = 11 AND gates.system_id = 6;
А данный запрос уже запросто переписывается через PHPFluent/Eloquent
:
DB::table('gates')
->left_join('drivers','gates.gate_type_id','=','drivers.gate_type_id')
->left_join('device_types','drivers.id','=','device_types.driver_id')
->where('device_types.id','=',$id_deviceType)
->where('gates.system_id','=',$id_system)
->get();
Не в сети
Страницы 1