db_update () с объединениями

9

Есть ли способ db_update()для следующего запроса?

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'

Я пытался использовать, db_update()->join();но это не сработало.

иван
источник

Ответы:

12

db_update()не реализует интерфейсы, которые имеют join()/ innerJoin()/ и т.д. методы, поэтому я думаю, что вы застряли с использованием db_query()и написанием строки запроса вручную.

$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);
Клайв
источник
это обходной путь, но в документации drupal говорится: «Не используйте эту функцию для запросов INSERT, UPDATE или DELETE. Они должны обрабатываться через db_insert (), db_update () и db_delete () соответственно». так что я думаю, что реализация подзапроса будет менее производительной, но более правильной. Что вы думаете ?
Иван
2
Я бы взял эту документацию с небольшим количеством соли ... если DBTNG не может выполнить запрос, который вам нужен с существующим классом, это вполне приемлемо для использования db_query(). Если вы хотите неукоснительно придерживаться документации, тогда, конечно, условие с подзапросом было бы возможным. Но, как вы говорите, он будет менее производительным, и для меня это не «лучше», чем использование простого SQL-запроса
Clive
Просто отметив, что это также относится и к Drupal 8, Updateне реализует никаких joinфункций, все же необходимо использовать общий запрос для этого случая.
Дэвид Томас