Melakukan kueri dengan kondisi bidang entitas dengan beberapa nilai

14

Saya memiliki tipe konten yang memiliki bidang referensi entitas yang memungkinkan pengguna untuk menambahkan beberapa istilah taksonomi di bidang itu. Saya mencoba melakukan kueri yang mengambil node yang memiliki sekumpulan istilah taksonomi tertentu dalam bidang itu.

Menggunakan satu nilai di bidang itu berfungsi dengan baik, seperti itu.

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

Di mana 2 adalah id dari istilah yang saya cari. Namun ketika saya mencoba mencari node yang mengandung dua istilah spesifik seperti itu,

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

Saya menerima kesalahan

Nomor parameter tidak valid: jumlah variabel terikat tidak cocok dengan jumlah token:

Saya juga sudah berusaha

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

Yang tidak gagal, tetapi tidak memberikan hasil yang diinginkan. Ini menampilkan setiap node yang memiliki istilah 2 ATAU istilah 8. Alih-alih istilah 2 DAN istilah 8 sebagaimana dimaksud. Bagaimana saya melakukan kueri yang memeriksa apakah sebuah simpul memiliki beberapa nilai spesifik dalam bidang referensi entitas?

Mat
sumber

Jawaban:

19

Gunakan dua yang terpisah 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();

Ini berfungsi tidak peduli berapa banyak istilah di lapangan atau di delta mana mereka berada.

Edit

Ini menghasilkan SQL ini:

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') )
4k4
sumber
Dia mencoba kode yang setara di atas dan tidak mengembalikan nilai, apakah Anda memeriksa bahwa kode ini berfungsi?
Eyal
Ya, ini berfungsi untuk bidang artikel dan tag standar yang diisi dengan banyak tag.
4k4
Mungkin saran saya gagal karena saya menulis seperti itu $and->condition('custom_taxonomy', [2], 'IN'),$and->condition('custom_taxonomy', [8], 'IN')
Eyal
3
Itu tidak masalah, hanya mengujinya, bekerja dengan baik 'IN'juga. Apa yang membuat perbedaan adalah dua kelompok DAN terpisah.
4k4
3
Bagus, tidak tahu ini berhasil. Masuk akal, karena hal ini memaksa banyak orang bergabung secara internal.
Berdir
8

Untuk melakukan kueri kompleks seperti yang Anda minta, Anda harus menggunakan grup kondisi dan untuk meminta 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);

Lihat dokumentasi QueryInterface :: condition .

Eyal
sumber
1
Saya menerapkan jawabannya, tetapi untuk beberapa alasan itu tidak menampilkan hasil yang tepat. Jika saya hanya menggunakan salah satu dari $ dan ketentuan, seperti [2], 'IN' atau [8], 'IN' itu akan menampilkan hasil dengan baik, tetapi ketika saya menggunakan keduanya, saya tidak mendapatkan hasil apa pun. Saya memeriksa tiga kali untuk memastikan saya memiliki node yang memiliki keduanya.
Matt
1
Berpikir tentang itu, tidak perlu untuk AND conditionGroup karena entitasQuery menggunakan DAN secara default.
Eyal
1
Oke saya mengubahnya hanya menggunakan $ query-> condition () tapi saya masih mengalami masalah bahwa ketika menggunakan keduanya tidak menampilkan hasil.
Matt
1
Sesuai dokumentasi QueryInterface :: condition Anda dapat menerapkan ketentuan pada delta. Saya akan memperbarui jawabannya dengan kode contoh.
Eyal
1
@Eyal, grup DAN kondisi tampaknya berlebihan, tetapi sangat membantu untuk menentukan beberapa kondisi untuk bidang yang sama. Anda hanya perlu menempatkan setiap kondisi dalam grup DAN terpisah.
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,
  ];
}
Viktor
sumber