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функций, все же необходимо использовать общий запрос для этого случая.
Дэвид Томас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.