db_update () z łączeniami


9

Czy istnieje sposób db_update()na następujące zapytanie?

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'

Próbowałem użyć, db_update()->join();ale to nie działało.

Odpowiedzi:


12

db_update()nie implementuje żadnych interfejsów, które mają join()/ innerJoin()/ etc. metody, więc myślę, że utknąłeś przy użyciu db_query()i ręcznym zapisywaniu ciągu zapytania.

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

jest to obejście, ale w dokumentacji drupal mówią: „Nie używaj tej funkcji do zapytań INSERT, UPDATE lub DELETE. Powinny być one obsługiwane odpowiednio przez db_insert (), db_update () i db_delete ()”. więc myślę, że może wdrożenie podzapytania byłoby mniej wydajne, ale bardziej poprawne. Co myślisz ?
ivan

2
Wziąłbym tę dokumentację ze szczyptą soli ... jeśli DBTNG nie może wykonać zapytania, którego potrzebujesz z istniejącą klasą, użycie tego jest całkowicie dopuszczalne db_query(). Jeśli chcesz ściśle trzymać się dokumentacji, to na pewno będzie warunek z podzapytaniem. Ale, jak mówisz, byłoby mniej wydajne i dla mnie nie spadło „lepsze” niż użycie prostego zapytania SQL
Clive

Wystarczy zauważyć, że wydaje się, że tak jest również w przypadku Drupala 8, Updatenie implementuje żadnych joinfunkcji, nadal muszę użyć ogólnego zapytania dla tego przypadku.
David Thomas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.