entityQuery với nhiều điều kiện về các điều khoản phân loại không trả về kết quả


13

Trong trường hợp sử dụng của tôi, tôi có một thực thể có hai trường liên quan đến các từ vựng độc đáo.

Tin tức: - thẻ (tham chiếu thực thể) - danh mục (tham chiếu thực thể)

Nếu tôi truy vấn một trong những tham chiếu đó, tôi nhận được kết quả tuy nhiên khi tôi truy vấn cả hai (bộ lọc AND) thì tôi không nhận được kết quả. Bây giờ tôi đã kiểm tra ba lần và có những thực thể chứa cả thẻ và danh mục tôi đang truy vấn.

Đây là lỗi người dùng hay lỗi Drupal?

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('type', 'news')
;
$group = $query->andConditionGroup()
    ->condition('field_tag.entity.name', ['cars'], 'IN')
    ->condition('field_category.entity.name', ['sport'], 'IN')
;
$query->condition($group);
$nids = $query->execute();

EDIT: Tôi đã tìm thấy một cách giải quyết bằng cách truy vấn giá trị thô thay vì entity.value. Đây là một tình huống không mong muốn mặc dù

$query = \Drupal::entityQuery('node')
    ->condition('status', 1)
    ->condition('type', 'news')
;
$group = $query->andConditionGroup()
    ->condition('field_tag.entity.name', ['cars'], 'IN')
    ->condition('field_category', [1], 'IN')
;
$query->condition($group);
$nids = $query->execute();

Kết hợp mặc định cho EQ là AND (mà bạn có thể thay đổi) vì vậy không có gì sai khi nhóm các điều kiện lại với nhau ... đó là lý do tại sao nó nằm trong đó. Tôi không hiểu những gì bạn đã mong đợi?

Câu trả lời:


8

Lý do bạn không thể làm điều đó là cả hai trường này đều là tham chiếu thực thể cho cùng một thực thể. Điều đó có nghĩa là bảng cơ sở là cùng một bảng cơ sở.

Bạn đang yêu cầu Drupal tham gia bảng taxonomy_data vào bảng nút và sau đó đưa ra một điều kiện AND không thể trên đó.

PS

Bạn có thể sử dụng condition('field_tags', 1);thay vìcondition('field_tags', [1], 'IN');

Và như đã đề cập trong các bình luận, nhóm điều kiện AND là mặc định, vì vậy bạn không cần chỉ định nó.

PPS

Bạn nên có cả hai điều kiện sử dụng id được tham chiếu để thống nhất.


1
Câu trả lời này chỉ bao gồm một trí tưởng tượng ngây thơ về cách truy vấn thực thể có thể hoạt động. Tuy nhiên, nó nhiều, nhiều khả năng hơn thế này. Kiểm tra câu trả lời của tôi.

3

Một phỏng đoán hoang dã, chưa được kiểm tra:

$query = \Drupal::entityQuery('node')
  ->condition('status', 1)
  ->condition('type', 'news');

$query = $query->condition($query->andConditionGroup()->condition('field_tag.entity.name', ['cars'], 'IN'))
  ->condition($query->andConditionGroup()->condition('field_category.entity.name', ['sport'], 'IN'));

Nếu điều này không hiệu quả thì hãy tìm tôi trong IRC # drupal-đóng góp vào tuần tới và chúng tôi sẽ kết thúc nó.


Điều này cần được khắc phục trong Drupal Core nhưng giải pháp trên hoạt động.
Mr.B

1

Thật ra tôi đã tìm thấy một bản hack này. đây là lời giải thích của tôi về những gì tôi đã tìm thấy:

Tôi đã có 3 trường trong loại nội dung của mình, mỗi trường giữ một tham chiếu đến thuật ngữ phân loại từ các từ vựng khác nhau. Và tôi muốn truy vấn các thực thể cho những thực thể có thuật ngữ phân loại cụ thể trong mỗi 3 trường đó (một và điều kiện).

kiểm tra truy vấn SQL nội bộ được tạo sau nhiều lần thử với các kết hợp điều kiện khác nhau tôi thấy rằng

[Previous conditions] AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_2)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_3)) AND (taxonomy_term__[taxonomy_term_field_name] IN  (:db_condition_placeholder_4))

về cơ bản như bạn có thể thấy, nó không có tham chiếu đến các trường riêng lẻ thực tế sử dụng từ vựng cụ thể đó, vì vậy, hack của tôi là làm một cái gì đó như thế này:

 $query = \Drupal::entityQuery('node')
            ->condition('status', '1')
            ->condition('type', $content_type_machine_name)
            ->condition('field_holding_term_ref.entity.name', array($label_of_term_in_field1, $label_of_term_in_field2, $label_of_term_in_field3), 'IN');

một lần nữa, nó đã hoạt động, tôi đã thử nghiệm nó và nó hoạt động như một điều kiện AND chỉ trả về loại nội dung với 3 thuật ngữ phân loại đó ngay cả khi các tham chiếu đến các thuật ngữ phân loại đó được lưu trữ trong các trường khác nhau trong loại nội dung.

Tôi không tự hào về vụ hack nhưng nó hoạt động, vì vậy nếu điều này có thể giúp ai đó cứu đôi khi, hãy tiếp tục.

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.