web-dev-qa-db-fra.com

Trier par poids en utilisant \ Drupal :: entityQuery ()

Je souhaite obtenir tous les termes de taxonomie dans la langue $lang, L'extrait suivant fonctionne correctement et renvoie tous les termes du code $lang.

    $query = \Drupal::entityQuery('taxonomy_term');
    $query->condition('vid', "news_category");
    $query->condition('langcode', $lang);
    $tids = $query->execute();
    //$terms = \Drupal\taxonomy\Entity\Term::loadMultiple($tids);
    return new JsonResponse($tids);

Ensuite, je veux obtenir des résultats afin que dans la liste de taxonomie qu'ils soient, essayez de les trier avec $query->sort('weight','ASC'); mais avec l'extrait de code suivant, les résultats sont les mêmes avant d'ajouter le tri.

    $query = \Drupal::entityQuery('taxonomy_term');
    $query->condition('vid', "news_category");
    $query->condition('langcode', $lang);
    $query->sort('weight','ASC');
    $tids = $query->execute();
    //$terms = \Drupal\taxonomy\Entity\Term::loadMultiple($tids);
    return new JsonResponse($tids);

Quelqu'un sait-il où est le problème? Comment puis-je obtenir des termes afin qu'ils soient dans la liste de taxonomie?

5
Yusef

La liste de présentation de la taxonomie utilise quelque chose comme:

  ->sort('weight', 'ASC')
  ->sort('name', 'ASC')

Si cela ne fonctionne pas pour vous, jetez un œil à \Drupal\taxonomy\TermStorage::loadTree

3
penyaskito

Comme cela a été suggéré précédemment, jetez un œil à \Drupal\taxonomy\TermStorage::loadTree est utile. La requête d'entité ne donne accès qu'aux propriétés de l'entité et à ses valeurs d'API de champ. Le poids du terme étant disponible dans le taxonomy_term_field_data table, il sera également disponible pour entityQuery. Cependant, toute imbrication de termes, également appelée hiérarchie, nécessitera l'accès à taxonomy_term_hierarchy table. Cela nécessiterait une requête de base de données.

Vous pouvez y accéder via une requête de base de données, comme vu dans loadTree, ligne 204:

    $query = \Drupal::database()->select('taxonomy_term_field_data', 't');
    $query->join('taxonomy_term_hierarchy', 'h', 'h.tid = t.tid');
    $result = $query
      ->addTag('taxonomy_term_access')
      ->fields('t')
      ->fields('h', array('parent'))
      ->condition('t.vid', $vid)
      ->condition('t.default_langcode', 1)
      ->orderBy('t.weight')
      ->orderBy('t.name')
      ->execute();

J'ai mis à jour la requête pour utiliser le conteneur de Drupal, plutôt que l'injection de dépendance afin qu'elle puisse être utilisée plus facilement. Vous devriez pouvoir le modifier pour l'adapter à vos besoins si Entity Query ne fonctionne pas comme vous le souhaitez.

2
merauluka

C’est un exemple.

$query = \Drupal::entityQuery('taxonomy_term');
$query->condition('vid', "VOCABULARY_ID");
$query->sort('weight');
$tids = $query->execute();
0
Mykola Veriga