結合を使用した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()/ etc を持つインターフェースを実装していません。メソッドなので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()で処理する必要があります。」したがって、サブクエリを実装するとパフォーマンスは低下しますが、より正確になると思います。どう思いますか ?
ivan

2
私はそのドキュメントを少しの塩でとります... DBTNGが既存のクラスで必要なクエリを実行できない場合は、を使用してもまったく問題ありませんdb_query()。ドキュメントに厳密に従う場合は、サブクエリを含む条件がオプションになります。しかし、あなたが言うように、それはパフォーマンスが低く、私にとっては、単純なSQLクエリを使用するよりも「良い」とは言えません
Clive

これはDrupal 8の場合にも当てはまるUpdateようjoinですが、関数を実装しておらず、この場合は汎用クエリを使用する必要があります。
David Thomas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.