An EntityFieldQuery
chỉ có thể đề cập đến một loại thực thể, nó không thể đại diện cho bất kỳ mối quan hệ giữa các thực thể. Nếu entity_type
trong truy vấn của bạn là a field_collection_item
, thì đó là loại thực thể mà truy vấn sẽ trả về. Không EntityFieldQuery
có khái niệm về thực tế rằng các bộ sưu tập trường của bạn có liên quan đến các nút, hoặc bất cứ điều gì khác cho vấn đề đó.
Để có được các thực thể liên quan đến các bộ sưu tập trường, bạn sẽ phải chạy một cái khác EntityFieldQuery
. Tôi chưa từng sử dụng bộ sưu tập trường trước đây nhưng tôi đoán logic sẽ trông giống như thế này:
$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'customer')
->fieldCondition('field_name_of_collection_field', 'name_of_field_collection_column', array_keys($result['field_collection_item']));
Có những thứ cần được thay đổi trong mã đó (tên của trường bộ sưu tập trường của bạn, tên cột cho mối quan hệ bộ sưu tập trường) nhưng nó sẽ giúp bạn bắt đầu.
Ví dụ thực tế của phương pháp hai truy vấn:
function get_species_country($id_country) {
$inner = new EntityFieldQuery();
$inner_r = $inner->entityCondition('entity_type', 'field_collection_item')
->fieldCondition('field_species_country', 'target_id', $id_country, '=')
->execute();
if(!empty($inner_r['field_collection_item'])) {
$keys = array_keys($inner_r['field_collection_item']);
$query = new EntityFieldQuery();
$species_r = $query->entityCondition('entity_type', 'node')
->entityCondition('bundle', self::$bundle)
->fieldCondition('field_species_countries', 'value', $keys)
->execute();
if(!empty($species_r['node'])) {
$ret = node_load_multiple(array_keys($species_r['node']));
}
}
return $ret;
}
Trong ví dụ trên:
- field_species_countries - Tên của bộ sưu tập trường
- field_species_country - Trường thực tế bên trong bộ sưu tập trường
Hạn chế : Tôi nghĩ rằng điều này có một số hạn chế vì truy vấn thứ hai chứa ... trường WHERE IN (1, 2, 3 ...). Đối với MySQL, điều này bị giới hạn bởi max_allowed_packet