¿Cómo realizar unir con múltiples columnas usando db_select?

8

¿Cómo realizar unir con múltiples columnas usando db_select? ¿Alguna ayuda?

Aquí debajo está la muestra, que estoy buscando.

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
fuente

Respuestas:

10

Puedes usar el siguiente 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();

Las llamadas a SelectQuery :: join () (al igual que SelectQuery :: leftJoin () , SelectQuery :: innerJoin () y SelectQuery :: addJoin () ) no se pueden encadenar porque esos métodos no devuelven un SelectQueryobjeto, pero el alias real usado para la unión. Si ejecuta el siguiente código, obtendrá un error.

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

Las cadenas en PHP no son objetos, y no definen el execute()método.

Para verificar que el código está ejecutando la consulta SQL correcta, se convierte $queryen una cadena e imprime. Obtendrá la consulta SQL que se ejecutará desde su 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;

Con este código, obtengo el siguiente resultado.

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
fuente
4

Prueba esto

$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
fuente
2
El código que está utilizando no funciona: leftJoin()no devuelve un SelectQueryobjeto. El código está llamando condition()a algo que no es un objeto.
kiamlaluno
En otras palabras, unirse no es capaz de encadenar
Mathankumar
@Mathankumar Esa es la palabra que estaba buscando: llamadas en cadena. :)
kiamlaluno
1
Aún así la respuesta es incorrecta. compruebe la respuesta por kiamlaluno
Mathankumar
Ahora esta bien. Nota adicional, por defecto, el operador para la condición es igual a (=), por lo que no es necesario especificarlos.
Mathankumar