Как выполнить объединение с несколькими столбцами, используя db_select?


8

Как выполнить объединение с несколькими столбцами, используя db_select? Любая помощь?

Здесь ниже образец, который я ищу.

SELECT * FROM digitaliq_flds_by_node a
JOIN digitaliq_fld_category b ON
  a.fld_id = b.fld_id AND
  a.fld_collection_id = b.fld_collection_id AND
  a.fld_group_name = b.fld_group_name

Ответы:


10

Вы можете использовать следующий код.

$query = db_select('digitaliq_flds_by_node', 'a')->fields('a');

$alias = $query->join('digitaliq_fld_category', 'b', 'a.fld_id = %alias.fld_id AND a.fld_collection_id = %alias.fld_collection_id AND a.fld_group_name = %alias.fld_group_name');

$terms = $query->execute();

Вызовы SelectQuery :: join () (аналогично SelectQuery :: leftJoin () , SelectQuery :: innerJoin () и SelectQuery :: addJoin () ) не могут быть цепочечными, потому что эти методы не возвращают SelectQueryобъект, но фактический псевдоним, используемый для объединения. Если вы выполните следующий код, вы получите ошибку.

$query = db_select('digitaliq_flds_by_node', 'a')
  ->fields('a')
  ->join('digitaliq_fld_category', 'b', 'a.fld_id = %alias.fld_id AND a.fld_collection_id = %alias.fld_collection_id AND a.fld_group_name = %alias.fld_group_name')
  ->execute();

Строки в PHP не являются объектами, и они не определяют execute()метод.

Чтобы убедиться, что код выполняет правильный запрос SQL, приведите его $queryк строке и распечатайте. Вы получите запрос SQL, который будет выполнен из вашего кода.

$query = db_select('digitaliq_flds_by_node', 'a')->fields('a');
$alias = $query->join('digitaliq_fld_category', 'b', 'a.fld_id = %alias.fld_id AND a.fld_collection_id = %alias.fld_collection_id AND a.fld_group_name = %alias.fld_group_name');
print $query;

С этим кодом я получаю следующий вывод.

SELECT a.*
FROM 
{digitaliq_flds_by_node} a
INNER JOIN {digitaliq_fld_category} b ON a.fld_id = b.fld_id AND a.fld_collection_id = b.fld_collection_id AND a.fld_group_name = b.fld_group_name

4

Попробуй это

$query = db_select('digitaliq_flds_by_node', 'a');
$query->join('digitaliq_fld_category', 'b', 'a.fld_id = b.fld_id');
$query->condition('a.fld_collection_id', 'b.fld_collection_id' '=');
$query->condition('a.fld_group_name', 'b.fld_group_name', '=');
$query->fields('a');
$query->execute();

2
Код, который вы используете, не работает: leftJoin()не возвращает SelectQueryобъект. Код вызывает condition()что-то, что не является объектом.
kiamlaluno

Другими словами, присоединиться не в состоянии цепи
Mathankumar

@Mathankumar Это слово, которое я искал: цепные звонки. :)
kiamlaluno

1
Тем не менее ответ неверен. проверить ответ от kiamlaluno
Mathankumar

Теперь это хорошо. Дополнительное примечание: по умолчанию оператор для условия равен (=), поэтому указывать их необязательно.
Матханкумар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.