db_update () với các phép nối


9

Có cách nào db_update()cho truy vấn sau đây không?

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'

Tôi đã thử sử dụng db_update()->join();nhưng nó không hoạt động.

Câu trả lời:


12

db_update()không thực hiện bất kỳ giao diện nào có join()/ innerJoin()/ vv. vì vậy tôi nghĩ rằng bạn đang bị mắc kẹt với việc sử dụng db_query()và viết chuỗi truy vấn ra bằng tay.

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

đó là một cách giải quyết nhưng trong tài liệu drupal họ nói "Không sử dụng chức năng này cho các truy vấn INSERT, UPDATE hoặc DELETE. Chúng nên được xử lý thông qua db_insert (), db_update () và db_delete ()." Vì vậy, tôi nghĩ rằng có thể để thực hiện một truy vấn con sẽ có hiệu suất thấp hơn nhưng chính xác hơn. Bạn nghĩ sao ?
ivan

2
Tôi sẽ lấy tài liệu đó bằng một nhúm muối ... nếu DBTNG không thể thực hiện truy vấn bạn cần với một lớp hiện có, thì hoàn toàn có thể chấp nhận sử dụng db_query(). Nếu bạn muốn kiên quyết bám vào tài liệu thì chắc chắn, một điều kiện với truy vấn con sẽ là một lựa chọn. Nhưng như bạn nói, nó sẽ ít hiệu quả hơn và với tôi không giảm "tốt hơn" so với sử dụng truy vấn sql thẳng
Clive

Chỉ cần lưu ý điều này dường như cũng là trường hợp trong Drupal 8, Updatekhông thực hiện bất kỳ joinchức năng nào , vẫn cần sử dụng truy vấn chung cho trường hợp này.
David Thomas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.