diff --git a/src/Persistence/Array_.php b/src/Persistence/Array_.php index 76c25ffb11..422efdc410 100644 --- a/src/Persistence/Array_.php +++ b/src/Persistence/Array_.php @@ -332,7 +332,15 @@ protected function setLimitOrder(Model $model, \Atk4\Data\Action\Iterator $actio */ public function applyScope(Model $model, \Atk4\Data\Action\Iterator $iterator) { - return $iterator->filter($model->scope()); + $scope = $model->scope(); + + // add entity ID to scope to allow easy traversal + if ($model->id_field && $model->getId() !== null) { + $scope = new Model\Scope([$scope]); + $scope->addCondition($model->getField($model->id_field), $model->getId()); + } + + return $iterator->filter($scope); } /** diff --git a/src/Persistence/Sql.php b/src/Persistence/Sql.php index 902e03c3c0..f4df5b7191 100644 --- a/src/Persistence/Sql.php +++ b/src/Persistence/Sql.php @@ -369,6 +369,12 @@ protected function setLimitOrder(Model $model, Query $query) public function initQueryConditions(Model $model, Query $query): void { $this->_initQueryConditions($query, $model->scope()); + + // add entity ID to scope to allow easy traversal + if ($model->id_field && $model->getId() !== null) { + $query->group($model->getField($model->id_field)); + $query->having($model->getField($model->id_field), $model->getId()); + } } private function _initQueryConditions(Query $query, Model\Scope\AbstractScope $condition = null): void diff --git a/tests/ExpressionSqlTest.php b/tests/ExpressionSqlTest.php index 4b017c07ba..a57fd598e2 100644 --- a/tests/ExpressionSqlTest.php +++ b/tests/ExpressionSqlTest.php @@ -113,9 +113,9 @@ public function testQuery() ); } - $i->tryLoad(1); - $this->assertEquals(10, $i->get('total_net')); - $this->assertEquals(30, $i->get('sum_net')); + $ii = (clone $i)->tryLoad(1); + $this->assertEquals(10, $ii->get('total_net')); + $this->assertEquals(30, $ii->get('sum_net')); $q = $db->dsql(); $q->field($i->action('count'), 'total_orders');