db_update () mit Joins

9

Gibt es eine Möglichkeit db_update()für die folgende Abfrage?

UPDATE field_data_field_TEST as ft 
left join node as n on ft.entity_id = n.nid
set n.type='test'
where n.type='foo'

Ich habe es versucht, db_update()->join();aber es hat nicht funktioniert.

ivan
quelle

Antworten:

12

db_update()implementiert keine Schnittstellen mit join()/ innerJoin()/ etc. Ich denke, Sie müssen db_query()die Abfragezeichenfolge nicht manuell verwenden und ausschreiben.

$sql = "
  UPDATE field_data_field_TEST as ft 
  left join node as n on ft.entity_id = n.nid
  set n.type = :type1
  where n.type = :type2";

$args = array(':type1' => 'test', ':type2' => 'foo');
db_query($sql, $args);
Clive
quelle
Es ist eine Problemumgehung, aber in der Drupal-Dokumentation heißt es: "Verwenden Sie diese Funktion nicht für INSERT-, UPDATE- oder DELETE-Abfragen. Diese sollten über db_insert (), db_update () bzw. db_delete () behandelt werden." Daher denke ich, dass die Implementierung einer Unterabfrage möglicherweise weniger Leistung, aber korrekter ist. Was denken Sie ?
Ivan
2
Ich würde diese Dokumentation mit einer Prise Salz nehmen ... Wenn DBTNG die benötigte Abfrage mit einer vorhandenen Klasse nicht ausführen kann, ist die Verwendung durchaus akzeptabel db_query(). Wenn Sie sich strikt an die Dokumentation halten möchten, ist eine Bedingung mit einer Unterabfrage eine Option. Aber wie Sie sagen, es wäre weniger performant und für mich ist es nicht besser, als eine reine SQL-Abfrage zu verwenden
Clive
Nur zu bemerken, dass dies auch in Drupal 8 der Fall zu sein scheint, Updatekeine joinFunktionen implementiert , muss dennoch die generische Abfrage für diesen Fall verwenden.
David Thomas