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.

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);

é 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.