From b62b4eae2bd16562dc4a81dec668d7bb78c08b11 Mon Sep 17 00:00:00 2001 From: Paul Klimov Date: Mon, 16 Dec 2013 15:54:32 +0200 Subject: [PATCH] Sphinx Active Relation lazy load fixed. --- extensions/yii/sphinx/ActiveRelation.php | 31 ++++++++++++++++++++++ .../unit/extensions/sphinx/ActiveRelationTest.php | 1 + 2 files changed, 32 insertions(+) diff --git a/extensions/yii/sphinx/ActiveRelation.php b/extensions/yii/sphinx/ActiveRelation.php index c0dd0ca..71939e0 100644 --- a/extensions/yii/sphinx/ActiveRelation.php +++ b/extensions/yii/sphinx/ActiveRelation.php @@ -19,4 +19,35 @@ use yii\db\ActiveRelationTrait; class ActiveRelation extends ActiveQuery implements ActiveRelationInterface { use ActiveRelationTrait; + + /** + * @inheritdoc + */ + public function createCommand($db = null) + { + if ($this->primaryModel !== null) { + // lazy loading + if ($this->via instanceof self) { + // via pivot index + $viaModels = $this->via->findPivotRows([$this->primaryModel]); + $this->filterByModels($viaModels); + } elseif (is_array($this->via)) { + // via relation + /** @var ActiveRelation $viaQuery */ + list($viaName, $viaQuery) = $this->via; + if ($viaQuery->multiple) { + $viaModels = $viaQuery->all(); + $this->primaryModel->populateRelation($viaName, $viaModels); + } else { + $model = $viaQuery->one(); + $this->primaryModel->populateRelation($viaName, $model); + $viaModels = $model === null ? [] : [$model]; + } + $this->filterByModels($viaModels); + } else { + $this->filterByModels([$this->primaryModel]); + } + } + return parent::createCommand($db); + } } \ No newline at end of file diff --git a/tests/unit/extensions/sphinx/ActiveRelationTest.php b/tests/unit/extensions/sphinx/ActiveRelationTest.php index f66845f..cd58035 100644 --- a/tests/unit/extensions/sphinx/ActiveRelationTest.php +++ b/tests/unit/extensions/sphinx/ActiveRelationTest.php @@ -30,6 +30,7 @@ class ActiveRelationTest extends SphinxTestCase $this->assertTrue($article->isRelationPopulated('index')); $this->assertTrue($index instanceof ArticleIndex); $this->assertEquals(1, count($article->populatedRelations)); + $this->assertEquals($article->id, $index->id); } public function testFindEager()