Wie führe ich mit db_select einen Join mit mehreren Spalten durch?


8

Wie führe ich mit db_select einen Join mit mehreren Spalten durch? Irgendeine Hilfe?

Hier unten ist das Beispiel, das ich suche.

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

Antworten:


10

Sie können den folgenden Code verwenden.

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

Aufrufe von SelectQuery :: join () (ebenso SelectQuery :: leftJoin () , SelectQuery :: innerJoin () und SelectQuery :: addJoin () ) sind nicht verkettbar, da diese Methoden kein SelectQueryObjekt zurückgeben. aber der tatsächliche Alias, der für den Join verwendet wird. Wenn Sie den folgenden Code ausführen, wird eine Fehlermeldung angezeigt.

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

Zeichenfolgen in PHP sind keine Objekte und definieren die execute()Methode nicht.

Um zu überprüfen, ob der Code die richtige SQL-Abfrage ausführt, wandeln Sie ihn $queryin eine Zeichenfolge um und drucken Sie ihn aus. Sie erhalten die SQL-Abfrage, die von Ihrem Code ausgeführt wird.

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

Mit diesem Code erhalte ich die folgende Ausgabe.

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

Versuche dies

$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
Der von Ihnen verwendete Code funktioniert nicht: leftJoin()Gibt kein SelectQueryObjekt zurück. Der Code fordert condition()etwas, das kein Objekt ist.
Kiamlaluno

Mit anderen Worten, Join ist nicht
kettenfähig

@ Mathankumar Das ist das Wort, nach dem ich gesucht habe: kettenfähige Anrufe. :)
Kiamlaluno

1
Trotzdem ist die Antwort falsch. Überprüfen Sie die Antwort von Kiamlaluno
Mathankumar

Jetzt ist es gut. Zusätzlicher Hinweis: Standardmäßig ist der Operator für Bedingung gleich (=), daher müssen diese nicht angegeben werden.
Mathankumar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.