db_update () com junções

9

Existe alguma maneira de fazer db_update()a seguinte consulta?

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'

Eu tentei usar, db_update()->join();mas não funcionou.

ivan
fonte

Respostas:

12

db_update()não implementa nenhuma interface que tenha join()/ innerJoin()/ etc. métodos, então eu acho que você está preso ao uso db_query()e gravação manual da string de consulta.

$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
fonte
é uma solução alternativa, mas na documentação do drupal eles dizem "Não use esta função para consultas INSERT, UPDATE ou DELETE. Elas devem ser tratadas via db_insert (), db_update () e db_delete () respectivamente". então eu acho que talvez implementar uma subconsulta seria menos desempenho, mas mais corretamente. O que você acha ?
ivan
2
Eu levaria essa documentação com uma pitada de sal ... se o DBTNG não puder executar a consulta que você precisa com uma classe existente, é perfeitamente aceitável usar db_query(). Se você deseja manter rigidamente a documentação, com certeza, uma condição com uma subconsulta seria uma opção. Mas, como você diz, seria menos eficiente e, para mim, não caiu 'melhor' do que usar uma consulta sql direta
Clive
Apenas observando que esse também parece ser o caso no Drupal 8, Updatenão implementa nenhuma joinfunção, ainda é necessário usar a consulta genérica para este caso.
David Thomas