Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 03.04.2013 11:54:55

Помогите написать join с использованием Fluent

Есть следующий SQL запрос:

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() , но как не пойму. Кто либо писал подобные запросы?

Не в сети

#2 03.04.2013 12:03:26

Re: Помогите написать join с использованием Fluent

Именно Fluent или Eloquent? Зачем тебе Fluent?

С Eloquent просто:

PHP
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();

Не в сети

#3 04.04.2013 13:11:50

Re: Помогите написать join с использованием Fluent

  1. Именно Fluent или Eloquent? Зачем тебе Fluent?

Потому что мне точно известно, что Fluent использует подготовленный запросы и защищен от SQL-инъекций. И насколько мне известно Eloquent и Fluent используют различные Query классы. Если ошибаюсь, пожалуйста поправьте.
Что касается запроса, то так я пробовал:

PHP
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();

Также как и это:

PHP
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 критериев, только вот как это сделать?

Не в сети

#4 05.04.2013 07:37:22

Re: Помогите написать join с использованием Fluent

  1. Потому что мне точно известно, что Fluent использует подготовленный запросы и защищен от SQL-инъекций.

Тоже самое относится к Eloquent — это надстройка над Fluent, даёт возможность работать с моделями и использовать связи, активную загрузку и пр. Впрочем, в твоём случае это всего лишь запрос и связей нет, поэтому Eloquent == Fluent.

Для справки: в MySQL не имеет (или почти не имеет) значения, где передаются условия. Использование ON — синтаксический сахар; ничего не изменится, если ты передашь все условия в одном WHERE. Свою догадку можешь проверить, перенеся одно или оба ON.

Не в сети

#5 11.04.2013 09:41:11

Re: Помогите написать join с использованием Fluent

Странно, почему я этого сразу не понял, но запрос приведенный мной выше равносилен этому:

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 :

PHP
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();

Спасибо за консультацию касательно PHPFluent/Eloquent.

Не в сети

Подвал раздела