Làm cách nào để trích xuất các giá trị của bộ sưu tập trường bằng Entityfieldquery?


7

Tôi đã tạo một loại nội dung 'khách hàng' trong đó tôi có một bộ sưu tập trường có tên 'field_group'. Bộ sưu tập trường có 2 trường là:

  1. Tiêu đề
  2. Tên

Loại nội dung của khách hàng và bộ sưu tập trường nhóm thuộc loại thực thể 'nút' và 2 trường trong nhóm thuộc loại thực thể 'field_collection_item'. Tôi muốn truy vấn cơ sở dữ liệu để lấy các giá trị của các trường trong nhóm cho loại nội dung cụ thể này. Tôi đã sử dụng để theo truy vấn để có được các giá trị trường của nhóm.

    $query = new EntityFieldQuery();

    $query->entityCondition('entity_type', 'field_collection_item')
          ->entityCondition('bundle', 'field_group');

    $result = $query->execute();

$nodes = entity_load('field_collection_item', array_keys($result['field_collection_item'])); 

Nhưng thực thể ở trên lấy ra tất cả các giá trị của loại thực thể field_collection_item. Nhưng tôi chỉ muốn các giá trị của loại nội dung 'khách hàng'. Bất cứ ai có thể cho tôi biết những gì sai với truy vấn trên?

Câu trả lời:


11

An EntityFieldQuerychỉ 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_typetrong 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 EntityFieldQuerycó 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


Tôi sẽ thử nó và cho bạn biết .. Chúc mừng bạn đời.
Nhà phát triển Drupal

1
Điều này khá hữu ích, cảm ơn! Tôi phải mất một chút thời gian để quấn đầu, vì vậy có thể đáng nhấn mạnh phần quan trọng là bạn phải chạy một giây EntityFieldQuery , trả về EntityIds của các mục bộ sưu tập trường có liên quan, sau đó được cắm vào phương thức FieldCondition của truy vấn chính.
sửa

0

Tôi nghĩ bạn sẽ muốn sử dụng tham số delta_group để cho EFQ biết rằng các trường được cho là có liên quan. Có một lời giải thích tốt trong bình luận này về tài liệu FieldCondition .

Tham số $ delta_group cho phép bạn nhóm các điều kiện lại với nhau. Tôi đã luôn đọc các tài liệu có nghĩa là chúng tôi đã chỉ định đồng bằng trong chính trường đó, nhưng đây không phải là trường hợp.

Ví dụ: nếu bạn muốn chọn các thực thể dựa trên hai cột từ cùng một trường, bạn sử dụng một nhóm delta để đảm bảo rằng các điều kiện phụ thuộc.


Ghét phải là một kẻ hạ bệ, nhưng điều này không đúng như tôi có thể nói - như Clive đã nói, EntityFieldQuery không có khái niệm rằng hai gói có liên quan với nhau; về cơ bản chúng hoạt động như hai loại thực thể riêng biệt. Điều đó nói rằng, nếu bạn có thể thực hiện một bằng chứng về khái niệm bằng cách sử dụng delta_groups, tôi sẽ vui vẻ hủy bỏ.
aendrew

aendrew, tôi hiểu nhầm những gì đang diễn ra trong ví dụ mã này, hoặc hiểu sai câu hỏi? drupal.org/node/916776#comment-4011564
beth

Tôi nghĩ câu hỏi - nhóm delta chỉ liên kết các điều kiện với nhau (giống như thêm dấu ngoặc đơn trong câu lệnh if). Những gì câu hỏi đang yêu cầu về cơ bản là truy vấn một loại thực thể và sau đó sử dụng kết quả của điều đó làm điều kiện trong truy vấn thứ hai. Trường được đề cập là Bộ sưu tập trường , là một loại thực thể riêng biệt với các trường duy nhất của riêng nó (Thật khó để giải thích nếu bạn chưa bao giờ sử dụng Bộ sưu tập trường - mặc dù, đó là một mô-đun khá thú vị và đáng để kiểm tra nếu không ).
aendrew
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.