diff --git a/CHANGELOG-v3.md b/CHANGELOG-v3.md index 74ac0403774..84b966534e7 100644 --- a/CHANGELOG-v3.md +++ b/CHANGELOG-v3.md @@ -1,5 +1,10 @@ # Release Notes for Craft CMS 3.x +## Unreleased + +### Fixed +- Fixed a bug where the `relatedTo` element query param could include results for elements that were related via soft-deleted Matrix blocks. ([#3846](https://github.com/craftcms/cms/issues/3846)) + ## 3.1.11 - 2019-02-14 ### Added diff --git a/src/elements/db/ElementRelationParamParser.php b/src/elements/db/ElementRelationParamParser.php index 75087be3aec..a726b242b60 100644 --- a/src/elements/db/ElementRelationParamParser.php +++ b/src/elements/db/ElementRelationParamParser.php @@ -303,14 +303,17 @@ private function _subparse($relCriteria) $sourcesAlias = 'sources' . $this->_relateSourcesCount; $targetMatrixBlocksAlias = 'target_matrixblocks' . $this->_relateTargetMatrixBlocksCount; + $targetMatrixElementsAlias = 'target_matrixelements' . $this->_relateTargetMatrixBlocksCount; $subQuery = (new Query()) ->select([$sourcesAlias . '.targetId']) ->from([$sourcesAlias => Table::RELATIONS]) ->innerJoin(Table::MATRIXBLOCKS . ' ' . $targetMatrixBlocksAlias, "[[{$targetMatrixBlocksAlias}.id]] = [[{$sourcesAlias}.sourceId]]") + ->innerJoin(Table::ELEMENTS . ' ' . $targetMatrixElementsAlias, "[[{$targetMatrixElementsAlias}.id]] = [[{$targetMatrixBlocksAlias}.id]]") ->where([ $targetMatrixBlocksAlias . '.ownerId' => $relElementIds, $targetMatrixBlocksAlias . '.fieldId' => $fieldModel->id, + $targetMatrixElementsAlias . '.dateDeleted' => null, ]); if ($relCriteria['sourceSite']) { @@ -327,13 +330,16 @@ private function _subparse($relCriteria) } else { $this->_relateSourceMatrixBlocksCount++; $sourceMatrixBlocksAlias = 'source_matrixblocks' . $this->_relateSourceMatrixBlocksCount; + $sourceMatrixElementsAlias = 'source_matrixelements' . $this->_relateSourceMatrixBlocksCount; $matrixBlockTargetsAlias = 'matrixblock_targets' . $this->_relateSourceMatrixBlocksCount; $subQuery = (new Query()) ->select([$sourceMatrixBlocksAlias . '.ownerId']) ->from([$sourceMatrixBlocksAlias => Table::MATRIXBLOCKS]) + ->innerJoin(Table::ELEMENTS . ' ' . $sourceMatrixElementsAlias, "[[{$sourceMatrixElementsAlias}.id]] = [[{$sourceMatrixBlocksAlias}.id]]") ->innerJoin(Table::RELATIONS . ' ' . $matrixBlockTargetsAlias, "[[{$matrixBlockTargetsAlias}.sourceId]] = [[{$sourceMatrixBlocksAlias}.id]]") ->where([ + $sourceMatrixElementsAlias . '.dateDeleted' => null, $matrixBlockTargetsAlias . '.targetId' => $relElementIds, $sourceMatrixBlocksAlias . '.fieldId' => $fieldModel->id ]);