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.
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:
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_type
có trường được đặt tên field_foo
vớ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();
Tôi nghĩ rằng lý do chính thích EntityFieldQuery
hơn db_select
là 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 .
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()
.
entity_metadata_wrapper()
giúp đỡ ở đây. Bạn vẫn cần tải thực thể.
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ụ: entityFieldQuery
sử 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