Taksonomi terimleri üzerinde birden fazla koşula sahip entityQuery sonuç vermiyor


13

Benim kullanım durumumda, benzersiz kelime dağarcığıyla ilgili iki alana sahip bir kuruluşum var.

Haberler: - etiketi (varlık referansı) - kategori (varlık referansı)

Ben bu başvuru birinde sorgulamak ancak her ikisi de (bir AND filtresi) sorgulama sonuçları elde edersiniz. Şimdiye kadar üç kez kontrol ettim ve sorguladığım hem etiketi hem de kategoriyi içeren varlıklar var.

Bu bir kullanıcı hatası mı yoksa Drupal hatası mı?

$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: entity.value yerine ham değeri sorgulayarak bir geçici çözüm buldum. Bu istenmeyen bir durum olsa da

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

EQ için varsayılan kavşak AND'dir (değiştirebileceğiniz), bu nedenle birlikte gruplama koşullarında yanlış bir şey yoktur ... bu yüzden oradadır. Ne beklediğini anlamıyorum?

Yanıtlar:


8

Bunu yapamamanızın nedeni, bu alanların her ikisinin de aynı varlığa varlık referansı olmasıdır. Bu, temel tablonun aynı temel tablonun olduğu anlamına gelir.

Drupal'dan taxonomy_data tablosuna düğüm tablosuna katılmasını ve ardından imkansız bir AND koşulu oluşturmasını istiyorsunuz.

PS

Sen kullanabilirsiniz condition('field_tags', 1);yerinecondition('field_tags', [1], 'IN');

Yorumlarda belirtildiği gibi, AND koşulu grubu varsayılan değerdir, bu nedenle belirtmeniz gerekmez.

PPS

Her iki koşulun da tutarlı olmak için başvurulan kimliği kullanmanız gerekir.


1
Bu cevap yalnızca varlık sorgusunun nasıl çalışabileceğine dair naif bir hayal gücü içerir. Ancak bundan çok, çok daha yetenekli. Cevabımı kontrol et.

3

Vahşi, test edilmemiş bir tahmin:

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

Bu işe yaramazsa beni gelecek hafta IRC # drupal-katkıda bulun ve sonunda bitireceğiz.


Bu Drupal Core'da düzeltilmelidir, ancak yukarıdaki çözüm işe yarar.
Mr.B

1

Aslında buna bir hack buldum. İşte bulduğum şeyle ilgili açıklamam:

İçerik türümde her biri farklı sözcüklerden bir sınıflandırma terimine referansta bulunan 3 alanım vardı. Ve bu 3 alanın her birinde belirli bir sınıflandırma terimi olan varlıkları sorgulamak istedim (a ve koşul).

Farklı koşul kombinasyonlarıyla yapılan birkaç denemeden sonra üretilen dahili SQL sorgusunu kontrol ettim.

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

temelde gördüğünüz gibi, o belirli kelimeleri kullanarak gerçek bireysel alanlara referans yok, bu yüzden benim kesmek böyle bir şey yapmaktır:

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

yine bu işe yarıyor, test ettim ve içerik kategorisindeki farklı alanlarda depolanmış olsa bile, bu 3 taksonomi terimiyle yalnızca içerik türü döndüren bir AND koşulu olarak çalışır.

Kesimle gurur duymuyorum ama işe yarıyor, eğer bu birisinin bir zaman kurtarmasına yardımcı olabilirse, bunun için git.

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.