web-dev-qa-db-fra.com

Comment ajouter une expression SQL à la requête d'entité? (D8)

Supposons que nous ayons une requête d'entité comme celle-ci:

$query = \Drupal::service('entity_type.manager')->getStorage('taxonomy_term')->getQuery();
$tids = $query->condition('vid', 'tags')->execute();

et nous devons ajouter une expression et une condition SQL basées sur elle, comme suit:

Replace(name, ' ', '-') = 'some-tag'

Comment faire ça?

Le Drupal\Core\Entity\Query\Sql\Query la classe n'a pas de méthode pour le faire (contrairement à Drupal\Core\Database\Query\Select).

3
Mike Shiyan

En utilisant la requête balises et métadonnées la requête sous-jacente Select peut être modifiée facilement.

$query = \Drupal::service('entity_type.manager')->getStorage('taxonomy_term')->getQuery();

// Add tag and any metadata to the entity query.
$query->addTag('my_category')
  ->addMetaData('my_category', $dynamic_category_name);

$tids = $query->condition('vid', 'tags')->execute();

Et puis dans my_module.module fichier:

/**
 * Implements hook_query_TAG_alter() for my_category tag.
 */
function my_module_query_my_category_alter(\Drupal\Core\Database\Query\AlterableInterface $query) {
  $expression = "Replace(taxonomy_term_field_data.name, ' ', '-')";
  $args = [
    ':dynamic_category_name' => $query->getMetaData('my_category'),
  ];

  $query->addExpression($expression);
  $query->where($expression . ' = :dynamic_category_name', $args);
}
4
Mike Shiyan