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?
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.
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();