EntityFieldQuery vs Db_select ()


19

Tại sao tôi nên sử dụng EntityFieldQuery khi tôi có thể thực hiện cùng một công việc với Db_select () để tìm nạp giá trị.

Sẽ tốt hơn nếu ai đó có thể cung cấp một ví dụ, không chỉ là một liên kết.

Câu trả lời:


11

Tôi nghĩ vấn đề là cú pháp đơn giản hơn nhiều và mã sẽ dễ hiểu hơn.

Ví dụ: nếu bạn muốn các nút có loại my_typecó trường được đặt tên field_foovới giá trị $val, với Db_Select, yuoll làm một cái gì đó như:

$nids = db_select('node', 'n')
  ->fields('n', array('nid'))
  ->join('field_data_field_foo', 'foo', 'foo.entity_id = n.nid')
  ->condition('n.type', 'my_type')
  ->condition('foo.field_foo_value', $val)
  ->execute()->fetchCol();

Điều này đơn giản hơn nhiều với EntityFieldQuery:

$query = new EntityFieldQuery;
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'my_type')
  ->fieldCondition('field_foo', 'value', $val)
  ->execute();

14

Tôi nghĩ rằng lý do chính thích EntityFieldQueryhơn db_selectlà bạn không cần phải biết về cấu trúc cấp thấp hơn, nói cách khác: làm thế nào các công cụ được lưu trữ trong cơ sở dữ liệu. Điều này cải thiện khớp nối lỏng lẻo .


6
Điều này là chính xác, mặc dù nó còn đi xa hơn. Các lưu trữ trường là cắm. Việc triển khai mặc định lưu trữ dữ liệu trường trong một bảng riêng cho mỗi trường trong cơ sở dữ liệu, nhưng nó có thể được thay thế, ví dụ như có một triển khai cho phép lưu trữ dữ liệu trường trong MongoDB. Nếu bạn muốn mã của mình có thể di động và không chỉ hoạt động trên cấu hình trang web cụ thể của bạn, bạn phải sử dụng EntityFieldQuery.
Berdir

3

EntityFieldQuery (EFQ) sẽ chỉ trả về ID thực thể. Nếu bạn muốn truy cập dữ liệu thực thể, bạn sẽ phải gọi entity_load(), trong đó, trong khi tải dữ liệu, sẽ đảm bảo rằng tất cả nội dung cơ bản mà bạn thường không quan tâm (như tải trường, gọi các mô-đun khác, v.v.) được thực hiện . Tất nhiên, điều này dẫn đến hai truy vấn SQL và rất nhiều chi phí, nhưng đây là cái giá phải trả cho sự trừu tượng hóa.

Đối với cú pháp EFQ rõ ràng hơn, tôi nghĩ đó là câu hỏi về sở thích cá nhân nhiều hơn. Tôi, ví dụ, không nghĩ rằng EFQ rõ ràng hơn. Lưu ý rằng một db_select()sự thay thế hoạt động với EFQ phải bao gồm kiểm tra giá trị trả về và entity_load()cuộc gọi tiếp theo và điều này làm tăng thêm tiếng ồn cho mã, IMHO:

$query = new EntityFieldQuery();
$entities = $query->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'my_type')
  ->fieldCondition('field_foo', 'value', $val)
  ->execute();
if (!empty($entities['node'])) {
  $nodes = entity_load('node', array_keys($entities['node']));
} else {
  $nodes = array();
}

Vì vậy, trả lời câu hỏi của bạn: sử dụng EFQ nếu các thực thể của bạn có đầy đủ tính năng (ví dụ: có thể thực hiện được, có thể được sử dụng bởi các mô-đun khác, v.v.) và / hoặc bạn nghĩ rằng cú pháp của nó rõ ràng hơn. Nếu các trường hợp khác, sử dụng có thể sử dụng db_select().


Không chính xác, bạn có thể sử dụng entity_metadata_wrapper và chỉ truy cập những gì bạn cần.
Kevin

Tôi không thấy làm thế nào để entity_metadata_wrapper()giúp đỡ ở đây. Bạn vẫn cần tải thực thể.
flaviovs

1

EntityFieldQuery hạn chế hơn nhiều db_select(), vì vậy bạn nên có lý do thực sự tốt để không sử dụng db_select()(xem câu trả lời bart), có thể đọc đủ và linh hoạt hơn nhiều.

Ví dụ: entityFieldQuerysử dụng InternalJoin để tìm nạp các trường. Nếu bạn cần một tráiJoin vì bất kỳ lý do gì, bạn bị mắc kẹt ... http://drupal.org/node/1226622


Chà, tôi muốn biết lý do tại sao anwser của tôi có "-1". vâng, entityFieldQuery đẹp hơn, nhưng kém hiệu quả hơn db_select, đó là một API rất đẹp, mạnh mẽ và đầy đủ ... Tôi loại bỏ rất nhiều entityFieldQuery khỏi mã của mình vì nó quá hạn chế cho các trường hợp sử dụng cụ thể, nghĩ rằng nó hoàn toàn xứng đáng chỉ ra. Dù sao.
yann_yinn

1
Tôi nghĩ rằng một số người không thích câu trả lời của bạn vì không thể thừa nhận cách entityFieldQuery là một lớp trừu tượng bên trên các phương thức lưu trữ khác nhau, đây là một tính năng thú vị. Tôi làm việc trên nhiều trang web mà chúng tôi biết rằng, MySQL sẽ luôn là cơ sở dữ liệu cho x / y / z và chúng tôi cũng thích viết các truy vấn db gọn hơn khi chúng tôi cần. Tôi không thấy entityFieldQuery đẹp hơn db_select. 2 so sánh ở đầu trang gần như giống hệt nhau về mặt thị giác.
Charlie Schliesser

vâng, đó là lý do tại sao tôi viết "xem bart answer". Ngoại trừ trường hợp sử dụng đặc biệt này, db_select sẽ hiệu quả hơn và linh hoạt hơn nhiều.
yann_yinn

Tôi hoàn toàn đồng ý.
Charlie Schliesser
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.