db_update () avec jointures

9

Existe-t-il un moyen de répondre à db_update()la requête suivante?

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'

J'ai essayé d'utiliser db_update()->join();mais cela n'a pas fonctionné.

ivan
la source

Réponses:

12

db_update()n'implémente pas d'interfaces avec join()/ innerJoin()/ etc. méthodes, donc je pense que vous êtes coincé avec l'utilisation db_query()et l'écriture de la chaîne de requête manuellement.

$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
la source
c'est une solution de contournement mais dans la documentation drupal ils disent "N'utilisez pas cette fonction pour les requêtes INSERT, UPDATE ou DELETE. Celles-ci doivent être gérées via db_insert (), db_update () et db_delete () respectivement." donc je pense que peut-être implémenter une sous-requête serait moins performant mais plus correctement. Qu'est-ce que tu penses ?
ivan
2
Je prendrais cette documentation avec une pincée de sel ... si DBTNG ne peut pas exécuter la requête dont vous avez besoin avec une classe existante, il est parfaitement acceptable de l'utiliser db_query(). Si vous voulez vous en tenir rigoureusement à la documentation, alors bien sûr, une condition avec une sous-requête serait une option. Mais comme vous le dites, ce serait moins performant et pour moi, cela ne serait pas mieux que d'utiliser une requête SQL simple
Clive
Il suffit de noter que cela semble être également le cas dans Drupal 8, Updaten'implémente aucune joinfonction, doit toujours utiliser la requête générique pour ce cas.
David Thomas