From e551206954fe8ed16c9b0894c0cd17beeaf4335d Mon Sep 17 00:00:00 2001 From: Francesco Placella Date: Thu, 17 May 2018 17:12:38 +0200 Subject: [PATCH] Issue #2580265 by FeyP, jcisio, s_leu, Berdir, tstoeckler: entity query nested conditions must use LEFT joins when any of the parent condition groups is using OR --- core/lib/Drupal/Core/Entity/Query/Sql/Condition.php | 10 +++++++++- .../Drupal/KernelTests/Core/Entity/EntityQueryTest.php | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/lib/Drupal/Core/Entity/Query/Sql/Condition.php b/core/lib/Drupal/Core/Entity/Query/Sql/Condition.php index 00fe78c27f3..7f9351214d1 100644 --- a/core/lib/Drupal/Core/Entity/Query/Sql/Condition.php +++ b/core/lib/Drupal/Core/Entity/Query/Sql/Condition.php @@ -12,6 +12,13 @@ use Drupal\Core\Entity\Query\ConditionInterface; */ class Condition extends ConditionBase { + /** + * Whether this condition is nested inside an OR condition. + * + * @var bool + */ + protected $nestedInsideOrCondition = FALSE; + /** * The SQL entity query object this condition belongs to. * @@ -36,11 +43,12 @@ class Condition extends ConditionBase { $sql_condition = new SqlCondition($condition['field']->getConjunction()); // Add the SQL query to the object before calling this method again. $sql_condition->sqlQuery = $sql_query; + $condition['field']->nestedInsideOrCondition = $this->nestedInsideOrCondition || strtoupper($this->conjunction) === 'OR'; $condition['field']->compile($sql_condition); $conditionContainer->condition($sql_condition); } else { - $type = strtoupper($this->conjunction) == 'OR' || $condition['operator'] == 'IS NULL' ? 'LEFT' : 'INNER'; + $type = $this->nestedInsideOrCondition || strtoupper($this->conjunction) === 'OR' || $condition['operator'] === 'IS NULL' ? 'LEFT' : 'INNER'; $field = $tables->addField($condition['field'], $type, $condition['langcode']); $condition['real_field'] = $field; static::translateCondition($condition, $sql_query, $tables->isFieldCaseSensitive($condition['field'])); diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityQueryTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityQueryTest.php index 88bdf50a740..2c9b86826d7 100644 --- a/core/tests/Drupal/KernelTests/Core/Entity/EntityQueryTest.php +++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityQueryTest.php @@ -553,7 +553,7 @@ class EntityQueryTest extends EntityKernelTestBase { ->sort('id') ->execute(); - $this->assertResult(6, 14); + $this->assertResult(4, 6, 12, 14); } /**