Birden çok değer içeren bir varlık alanı koşulu ile sorgu gerçekleştirme


14

Kullanıcıların bu alanda birden fazla sınıflandırma terimleri eklemek için izin veren bir varlık başvuru alanı olan bir içerik türü var. Bu alandaki belirli bir sınıflandırma terimleri kümesi düğümleri kapmak sorguları gerçekleştirmek için çalışıyorum.

Bu alanda bir değer kullanmak iyi çalışıyor.

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

Burada 2, aradığım terimin kimliği. Ancak, böyle iki terim içeren düğümleri aramaya çalıştığımda,

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

Hatayı alıyorum

Geçersiz parametre numarası: bağlı değişken sayısı belirteç sayısıyla eşleşmiyor:

Ben de denedim

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

Bu başarısız olmaz, ancak istenen sonuçları sağlamaz. Bu terim 2 ya sahip her düğümü görüntüler VEYA terimini 8. Yerine terim 2 VE amaçlandığı gibi terimini 8. Bir düğümün varlık referans alanında birden çok belirli değeri olup olmadığını kontrol eden bir sorguyu nasıl gerçekleştiririm?

Yanıtlar:


19

İki ayrı kullanın 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();

Bu, alanda kaç terim olursa veya hangi deltada olursa olsun işe yarar.

Düzenle

Bu şu SQL ile sonuçlanır:

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

Yukarıda eşdeğer bir kod denedi ve değer döndürmedi, bu kodun çalışıp çalışmadığını kontrol ettiniz mi?
Eyal

Evet, birden çok etiketle dolu standart makale ve etiketler alanında çalışır.
4k4

Belki de önerim başarısız oldu çünkü ben böyle yazdım $and->condition('custom_taxonomy', [2], 'IN'),$and->condition('custom_taxonomy', [8], 'IN')
Eyal

3
Bu önemli değil, sadece test etti, birlikte çalışıyor 'IN'. Farkı yaratan iki ayrı AND grubudur.
4k4

3
Güzel, bunun işe yaradığını bilmiyordum. Bu, birden fazla güç içsel olarak birleştiğinden anlamlıdır.
Berdir

8

İstediğiniz gibi karmaşık sorgular yapmak için bir koşul grubu kullanmanız ve deltayı sorgulamanız gerekir.

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

QueryInterface :: koşul belgelerine bakın .


1
Cevabı uyguladım, ancak bazı nedenlerden dolayı doğru sonuçları göstermiyor. [2], 'IN' veya [8], 'IN' gibi $ ve koşullardan yalnızca birini kullanırsam, sonuçları gayet iyi görüntüler, ancak her ikisini de kullandığımda sonuç alamıyorum. Ben her ikisi de düğümler olduğundan emin olmak için üç kez kontrol.
Matt

1
Bu konuda düşünüldüğünde, entityQuery varsayılan olarak AND kullandığından AND conditionGroup'a gerek yoktur.
Eyal

1
Tamam, sadece $ query-> condition () kullanarak değiştirdim ama hala her ikisini de kullanırken herhangi bir sonuç görüntülememesi sorunu yaşıyorum.
Matt

1
Gereğince Queryınterface :: durum belgelerinde sen deltası üzerinde koşullarını uygulayabilirsiniz. Cevabı örnek bir kodla güncelleyeceğim.
Eyal

1
@Eyal, AND koşulu grubu gereksiz görünüyor, ancak aynı alan için birden çok koşul belirtmeye gerçekten yardımcı oluyor. Her koşulu yalnızca ayrı bir AND grubuna koymanız gerekir.
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,
  ];
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.