entitasQuery dengan beberapa kondisi syarat taksonomi menghasilkan tanpa hasil

13

Dalam kasus penggunaan saya, saya memiliki entitas yang memiliki dua bidang yang merujuk ke kosakata unik.

Berita: - tag (referensi entitas) - kategori (referensi entitas)

Jika saya meminta salah satu dari referensi tersebut, saya mendapatkan hasil namun ketika saya meminta keduanya (sebuah filter DAN) saya tidak mendapatkan hasil. Saya sudah memeriksanya tiga kali lipat sekarang dan ada entitas yang berisi tag dan kategori yang saya tanyakan.

Apakah ini kesalahan pengguna atau bug 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: Saya telah menemukan solusi dengan menanyakan nilai mentah alih-alih entity.value. Ini adalah situasi yang tidak diinginkan

$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();
Coder samar
sumber
Konjungsi default untuk EQ adalah AND (yang dapat Anda ubah) sehingga tidak ada yang salah dengan kondisi pengelompokan bersama ... itu sebabnya ada di sana. Saya tidak mengerti apa yang Anda harapkan?

Jawaban:

8

Alasan Anda tidak bisa melakukan itu adalah bahwa kedua bidang ini adalah referensi entitas ke entitas yang sama. Itu berarti bahwa tabel dasar adalah tabel dasar yang sama.

Anda meminta Drupal untuk Bergabung dengan tabel taxonomy_data ke tabel node dan kemudian membuat kondisi AND mustahil di atasnya.

PS

Anda bisa menggunakan condition('field_tags', 1);bukancondition('field_tags', [1], 'IN');

Dan seperti yang disebutkan dalam komentar, grup kondisi AND adalah default, jadi Anda tidak perlu menentukannya.

PPS

Anda harus kedua kondisi menggunakan id yang dirujuk agar konsisten.

Eyal
sumber
1
Jawaban ini hanya mencakup imajinasi naif tentang bagaimana kueri entitas dapat bekerja. Ini jauh, jauh lebih mampu daripada ini. Periksa jawabanku.
3

Tebakan liar yang belum diuji:

$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'));

Jika ini tidak berhasil, temukan saya di IRC # drupal-berkontribusi minggu depan dan kami akan menyelesaikannya.

Tim Yao
sumber
Ini harus diperbaiki di Drupal Core tetapi solusi di atas berfungsi.
Mr.B
1

Sebenarnya saya menemukan retasan untuk ini. inilah penjelasan saya tentang apa yang saya temukan:

Saya memiliki 3 bidang dalam tipe konten saya masing-masing memegang referensi ke istilah taksonomi dari berbagai kosa kata. Dan saya ingin menanyakan entitas yang memiliki istilah taksonomi tertentu di masing-masing 3 bidang (an dan kondisi).

memeriksa query SQL internal yang dihasilkan setelah beberapa upaya dengan berbagai kombinasi kondisi saya menemukan itu

[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))

pada dasarnya seperti yang Anda lihat, tidak ada referensi ke bidang individu yang sebenarnya menggunakan kosakata tertentu, jadi peretasan saya adalah melakukan sesuatu seperti ini:

 $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');

lagi ini berfungsi, saya sudah mengujinya dan berfungsi sebagai kondisi DAN hanya mengembalikan tipe konten dengan 3 istilah taksonomi bahkan jika referensi ke istilah taksonomi tersebut disimpan di bidang yang berbeda dalam tipe konten.

Saya tidak bangga dengan peretasan tetapi berhasil, jadi jika ini dapat membantu seseorang menghemat waktu, lakukan saja.

Elias
sumber