Comment interroger EntryQuery pour plusieurs sections avec différents types

Sep 16 2020

Je pense que la meilleure façon de poser cette question est de donner un exemple:

Étant donné une variable $ query de type craft \ elements \ db \ EntryQuery, j'aimerais obtenir des entrées de 2 sections différentes: "people" et "news". Parmi les entrées de la section "personnes", je ne veux que celles avec le type d'entrée "Employés". Comment pourrais-je configurer cela pour que le filtre "type" ne s'applique qu'à 1 section? Si je les interrogais individuellement, ils ressembleraient à ceci:

$query->section('people')->type('Employees');
$query->section('insights');

Comment puis-je faire cela en 1 requête? Merci!

Réponses

2 nstCactus Sep 16 2020 at 02:15

Je ne suis pas sûr que vous puissiez y parvenir en une seule requête.

La solution la plus simple à laquelle je puisse penser à votre problème nécessite 3 requêtes:

{% set peopleIds = craft.entries().section('people').type('Employees').ids() %}
{% set insightIds = craft.entries().section('insights').ids() %}
{% set query = craft.entries().id(peopleIds|merge(insightIds))

Les 2 premières requêtes sont exécutées et renvoient les identifiants des entrées correspondantes. Vous pouvez ensuite créer votre EntryQuery en utilisant les identifiants comme seul critère.

2 AdamTsai Sep 16 2020 at 03:55

Merci @nstCactus, c'est une excellente idée! Juste pour tous ceux qui recherchent l'équivalent PHP:

$peopleIds = \craft\elements\Entry::find()->section('people')->type('Employees')->ids(); $insightIds = \craft\elements\Entry::find()->section('insights')->ids();
$query->id(array_merge($peopleIds, $insightsIds));