Thực hiện truy vấn với điều kiện trường thực thể có nhiều giá trị


14

Tôi có một loại nội dung có trường tham chiếu thực thể cho phép người dùng thêm nhiều thuật ngữ phân loại trong trường đó. Tôi đang cố gắng thực hiện các truy vấn lấy các nút có một bộ thuật ngữ phân loại cụ thể trong trường đó.

Sử dụng một giá trị trong lĩnh vực đó hoạt động tốt, như vậy.

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', 2)
        ->sort('field_last_name', DESC);

Trong đó 2 là id của thuật ngữ tôi đang tìm kiếm. Tuy nhiên, khi tôi cố gắng tìm kiếm các nút có chứa hai thuật ngữ cụ thể như vậy,

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8])
        ->sort('field_last_name', DESC);

Tôi nhận được lỗi

Số tham số không hợp lệ: số lượng biến bị ràng buộc không khớp với số lượng mã thông báo:

Tôi cũng đã thử

    $query = \Drupal::entityQuery('node')
        ->condition('status', NODE_PUBLISHED)
        ->condition('type', 'custom_type')
        ->condition('custom_taxonomy', [2,8], 'IN')
        ->sort('field_last_name', DESC);

Mà không thất bại, nhưng không cung cấp kết quả dự định. Nó hiển thị mọi nút có thuật ngữ 2 HOẶC hạn 8. Thay vì thuật ngữ 2 hạn 8 như dự định. Làm cách nào để thực hiện truy vấn kiểm tra xem một nút có nhiều giá trị cụ thể trong trường tham chiếu thực thể không?

Câu trả lời:


19

Sử dụng hai riêng biệt andConditionGroup():

$query = \Drupal::entityQuery('node')
  ->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type');
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 2);
$query->condition($and);
$and = $query->andConditionGroup();
$and->condition('custom_taxonomy', 8);
$query->condition($and);
$result = $query->execute();

Điều này hoạt động cho dù có bao nhiêu điều khoản trong lĩnh vực hoặc trong đó delta.

Biên tập

Điều này dẫn đến SQL này:

SELECT base_table.vid AS vid, base_table.nid AS nid
FROM 
{node} base_table
INNER JOIN {node_field_data} node_field_data ON node_field_data.nid = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy ON node__custom_taxonomy.entity_id = base_table.nid
INNER JOIN {node__custom_taxonomy} node__custom_taxonomy_2 ON node__custom_taxonomy_2.entity_id = base_table.nid
WHERE  (node_field_data.status = '1') AND (node_field_data.type = 'custom_type') AND( (node__custom_taxonomy.custom_taxonomy_target_id = '2') )AND( (node__custom_taxonomy_2.custom_taxonomy_target_id = '8') )

Anh ta đã thử một mã tương đương ở trên và nó không trả về giá trị nào, bạn có kiểm tra xem mã này có hoạt động không?
Mắt

Có, nó hoạt động cho trường bài viết và thẻ tiêu chuẩn chứa nhiều thẻ.
4k4

Có lẽ đề nghị của tôi đã thất bại bởi vì tôi đã viết nó như vậy $and->condition('custom_taxonomy', [2], 'IN'),$and->condition('custom_taxonomy', [8], 'IN')
Eyal

3
Điều đó không quan trọng, chỉ cần thử nghiệm nó, làm việc với 'IN'quá. Điều làm nên sự khác biệt là hai nhóm AND riêng biệt.
4k4

3
Thật tuyệt, không biết điều này hoạt động. Có ý nghĩa, vì điều này buộc nhiều người tham gia trong nội bộ.
Berdir

8

Để thực hiện các truy vấn phức tạp như bạn đã yêu cầu, bạn sẽ cần sử dụng một nhóm điều kiện và truy vấn delta.

$query = \Drupal::entityQuery('node');
$query->condition('status', NODE_PUBLISHED)
  ->condition('type', 'custom_type')
  ->condition('custom_taxonomy', [2, 8], 'IN')
  ->condition('custom_taxonomy.%delta', 2, '=')
  ->sort('field_last_name', DESC);
$or = $query->orConditionGroup();
$or->condition('custom_taxonomy.0.target_id', 2);
$or->condition('custom_taxonomy.0.target_id', 8);
$query->condition($or);

Xem QueryInterface :: tài liệu điều kiện .


1
Tôi đã thực hiện câu trả lời, nhưng vì một số lý do, nó không hiển thị kết quả phù hợp. Nếu tôi chỉ sử dụng một trong các $ và điều kiện, như [2], 'IN' hoặc [8], 'IN', nó sẽ hiển thị kết quả tốt, nhưng khi tôi sử dụng cả hai, tôi sẽ không nhận được kết quả nào. Tôi đã kiểm tra ba lần để đảm bảo rằng tôi có các nút có cả hai.
Matt

1
Suy nghĩ về nó, không cần cho AND conditiongroup vì thực thể sử dụng AND theo mặc định.
Mắt

1
Được rồi, tôi đã thay đổi nó thành chỉ sử dụng $ query-> condition () nhưng tôi vẫn gặp vấn đề là khi sử dụng cả hai thì nó không hiển thị bất kỳ kết quả nào.
Matt

1
Theo tài liệu QueryInterface :: condition, bạn có thể áp dụng các điều kiện trên delta. Tôi sẽ cập nhật câu trả lời với một mã ví dụ.
Mắt

1
@Eyal, nhóm điều kiện AND có vẻ dư thừa, nhưng nó thực sự giúp chỉ định nhiều điều kiện cho cùng một trường. Bạn chỉ cần đặt từng điều kiện trong một nhóm AND riêng biệt.
4k4

1
$taxonomy_term = 'taxonomy_term';
    $vid = 'name_taxon';
    $terms = $this->entity_type_manager->getStorage($taxonomy_term)
      ->loadTree($vid);

foreach ($terms as $term) {
  $term_data[] = [
    "vid" => $term->vid,
    "name" => $term->name,
  ];
}
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.