web-dev-qa-db-fra.com

Requêtes SQL avec des conditions AND / OR

Je transfère des instructions SQL d'une installation Drupal 5 vers Drupal 8, et je lutte avec les conditions And/Or. Par exemple, étant donné le SQL original:

    SELECT .....
    WHERE .....
          AND classes.description = "Photographer"
          AND (classoptions.description = "Name of photographer here"
           OR classoptions.description = "Not assigned").

Je l'ai traduit en:

$query = $this->dbConnection->select('classes');
....etc....
$query->condition('classes.description', 'Photographer');

Jusqu'ici tout va bien. Ensuite, j'ai besoin d'une condition OR pour

$query->condition('classoptions.description', 'Name of photographer here');
$query->condition('classoptions.description', 'Not assigned');

En regardant la documentation en ligne, l'utilisation de db_or () est suggérée, comme dans:

$query->condition(db_or()
 ->condition('classoptions.description', 'Name of photographer here');
 ->condition('classoptions.description', 'Not assigned'));

..mais c'est a) déconseillé, b) donne l'erreur 'fonction db_or introuvable' Le remplacement de db_or () est d'obtenir un nouvel objet Condition, mais que dois-je faire avec? La fonction

 $query->orConditionGroup();

Renvoie un nouvel objet Condition et le code

$query->condition(orConditionGroup()
 ->condition('classoptions.description', 'Name of photographer here');
 ->condition('classoptions.description', 'Not assigned'));

Formate très bien un objet Condition avec les conditions à OR. Mais encore une fois, comment puis-je l'incorporer dans la requête?

6
davem

Regardez comment orConditionGroup() est utilisé dans le noyau. Par exemple, dans ConfigEntityQueryTest, il est utilisé de cette façon:

$query = $this->factory->get('config_query_test', 'AND');
$and_condition_1 = $query->orConditionGroup()
  ->condition('id', '2')
  ->condition('label', $this->entities[0]->label);
$and_condition_2 = $query->orConditionGroup()
  ->condition('id', 1)
  ->condition('label', $this->entities[3]->label);
$this->queryResults = $query
  ->condition($and_condition_1)
  ->condition($and_condition_2)
  ->execute();

Je suis sûr que vous pouvez appliquer cela à votre problème.

9
Maouna

Par souci d'exhaustivité, cela a fonctionné pour moi (grâce à l'affiche originale):

$query = \Drupal::entityQuery('taxonomy_term')
  ->condition('vid', 'surface');
$group = $query->orConditionGroup()
  ->condition('field_surface_exclude', NULL, 'IS NULL')
  ->condition('field_surface_exclude', 0);
$tids = $query->condition($group)->execute();
6
miiimooo