Como executar junção com várias colunas usando db_select?

8

Como executar junção com várias colunas usando db_select? Qualquer ajuda?

Aqui abaixo está o exemplo que estou procurando.

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
Kiran Kumar
fonte

Respostas:

10

Você pode usar o seguinte código.

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

As chamadas para SelectQuery :: join () ( SelectQuery :: da mesma forma como SelectQuery :: leftJoin () , SelectQuery :: innerJoin () e SelectQuery :: addJoin () ) não podem ser encadeadas em cadeia porque esses métodos não retornam um SelectQueryobjeto, mas o alias real usado para a associação. Se você executar o código a seguir, você receberá um erro.

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

Strings no PHP não são objetos e não definem o execute()método.

Para verificar se o código está executando a consulta SQL correta, faça a conversão $querypara uma sequência e imprima-a. Você receberá a consulta SQL que seria executada no seu código.

$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;

Com esse código, recebo a seguinte saída.

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
kiamlaluno
fonte
4

Tente isto

$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();
Sathiya
fonte
2
O código que você está usando não funciona: leftJoin()não retorna um SelectQueryobjeto. O código está chamando condition()por algo que não é um objeto.
kiamlaluno
Em outras palavras join não é acorrentar capaz
Mathankumar
@ Nathankumar Essa é a palavra que eu estava procurando: chamadas em cadeia. :)
kiamlaluno
11
Ainda a resposta está incorreta. verifique a resposta por kiamlaluno
Mathankumar
Agora está tudo bem. Nota adicional: por padrão, o operador para a condição é igual a (=), portanto, não é necessário especificá-las.
Mathankumar