diff --git a/source/Spiral/ORM/Entities/Loaders/AbstractLoader.php b/source/Spiral/ORM/Entities/Loaders/AbstractLoader.php index c99507f..6d16306 100644 --- a/source/Spiral/ORM/Entities/Loaders/AbstractLoader.php +++ b/source/Spiral/ORM/Entities/Loaders/AbstractLoader.php @@ -259,19 +259,20 @@ final public function __destruct() /** * @param SelectQuery $query + * @param bool $loadColumns * * @return SelectQuery */ - protected function configureQuery(SelectQuery $query): SelectQuery + protected function configureQuery(SelectQuery $query, bool $loadColumns = true): SelectQuery { foreach ($this->loaders as $loader) { if ($loader instanceof RelationLoader && $loader->isJoined()) { - $query = $loader->configureQuery(clone $query); + $query = $loader->configureQuery(clone $query, $loadColumns); } } foreach ($this->joiners as $loader) { - $query = $loader->configureQuery(clone $query); + $query = $loader->configureQuery(clone $query, false); } return $query; diff --git a/source/Spiral/ORM/Entities/Loaders/BelongsToLoader.php b/source/Spiral/ORM/Entities/Loaders/BelongsToLoader.php index 2a3a1ee..0b9dc20 100644 --- a/source/Spiral/ORM/Entities/Loaders/BelongsToLoader.php +++ b/source/Spiral/ORM/Entities/Loaders/BelongsToLoader.php @@ -35,11 +35,11 @@ class BelongsToLoader extends RelationLoader /** * {@inheritdoc} */ - protected function configureQuery(SelectQuery $query, array $outerKeys = []): SelectQuery + protected function configureQuery(SelectQuery $query, bool $loadColumns = true, array $outerKeys = []): SelectQuery { if (!empty($this->options['using'])) { //Use pre-defined query - return parent::configureQuery($query, $outerKeys); + return parent::configureQuery($query, $loadColumns, $outerKeys); } if ($this->isJoined()) { @@ -59,7 +59,7 @@ protected function configureQuery(SelectQuery $query, array $outerKeys = []): Se ); } - return parent::configureQuery($query); + return parent::configureQuery($query, $loadColumns); } /** diff --git a/source/Spiral/ORM/Entities/Loaders/HasManyLoader.php b/source/Spiral/ORM/Entities/Loaders/HasManyLoader.php index 75baa22..788b780 100644 --- a/source/Spiral/ORM/Entities/Loaders/HasManyLoader.php +++ b/source/Spiral/ORM/Entities/Loaders/HasManyLoader.php @@ -62,11 +62,11 @@ public function __construct($class, $relation, array $schema, ORMInterface $orm) /** * {@inheritdoc} */ - protected function configureQuery(SelectQuery $query, array $outerKeys = []): SelectQuery + protected function configureQuery(SelectQuery $query, bool $loadColumns = true, array $outerKeys = []): SelectQuery { if (!empty($this->options['using'])) { //Use pre-defined query - return parent::configureQuery($query, $outerKeys); + return parent::configureQuery($query, $loadColumns, $outerKeys); } if ($this->isJoined()) { @@ -112,7 +112,7 @@ protected function configureQuery(SelectQuery $query, array $outerKeys = []): Se ); } - return parent::configureQuery($query); + return parent::configureQuery($query, $loadColumns); } /** diff --git a/source/Spiral/ORM/Entities/Loaders/HasOneLoader.php b/source/Spiral/ORM/Entities/Loaders/HasOneLoader.php index 0a0b20f..d3960f5 100644 --- a/source/Spiral/ORM/Entities/Loaders/HasOneLoader.php +++ b/source/Spiral/ORM/Entities/Loaders/HasOneLoader.php @@ -37,16 +37,17 @@ class HasOneLoader extends RelationLoader 'alias' => null, 'using' => null, 'where' => null, + 'load' => false ]; /** * {@inheritdoc} */ - protected function configureQuery(SelectQuery $query, array $outerKeys = []): SelectQuery + protected function configureQuery(SelectQuery $query, bool $loadColumns = true, array $outerKeys = []): SelectQuery { if (!empty($this->options['using'])) { //Use pre-defined query - return parent::configureQuery($query, $outerKeys); + return parent::configureQuery($query, $loadColumns, $outerKeys); } if ($this->isJoined()) { @@ -81,7 +82,7 @@ protected function configureQuery(SelectQuery $query, array $outerKeys = []): Se ); } - return parent::configureQuery($query); + return parent::configureQuery($query, $loadColumns); } /** diff --git a/source/Spiral/ORM/Entities/Loaders/ManyToManyLoader.php b/source/Spiral/ORM/Entities/Loaders/ManyToManyLoader.php index 875e78d..f98b8c1 100644 --- a/source/Spiral/ORM/Entities/Loaders/ManyToManyLoader.php +++ b/source/Spiral/ORM/Entities/Loaders/ManyToManyLoader.php @@ -82,11 +82,11 @@ public function __construct( * * Visibility up. */ - public function configureQuery(SelectQuery $query, array $outerKeys = []): SelectQuery + public function configureQuery(SelectQuery $query, bool $loadColumns = true, array $outerKeys = []): SelectQuery { if (!empty($this->options['using'])) { //Use pre-defined query - return parent::configureQuery($query, $outerKeys); + return parent::configureQuery($query, $loadColumns, $outerKeys); } if ($this->isJoined()) { @@ -152,7 +152,7 @@ public function configureQuery(SelectQuery $query, array $outerKeys = []): Selec //User specified WHERE conditions $this->setWhere($query, $this->getAlias(), $whereTarget, $this->options['where']); - return parent::configureQuery($query); + return parent::configureQuery($query, $loadColumns); } /** diff --git a/source/Spiral/ORM/Entities/Loaders/RelationLoader.php b/source/Spiral/ORM/Entities/Loaders/RelationLoader.php index d2712ca..58dce7d 100644 --- a/source/Spiral/ORM/Entities/Loaders/RelationLoader.php +++ b/source/Spiral/ORM/Entities/Loaders/RelationLoader.php @@ -144,7 +144,7 @@ public function loadData(AbstractNode $node) } //Ensure all nested relations - $statement = $this->configureQuery($this->createQuery(), $references)->run(); + $statement = $this->configureQuery($this->createQuery(), true, $references)->run(); $statement->setFetchMode(\PDO::FETCH_NUM); foreach ($statement as $row) { @@ -161,18 +161,21 @@ public function loadData(AbstractNode $node) * Configure query with conditions, joins and columns. * * @param SelectQuery $query + * @param bool $loadColumns * @param array $outerKeys Set of OUTER_KEY values collected by parent loader. * * @return SelectQuery */ - protected function configureQuery(SelectQuery $query, array $outerKeys = []): SelectQuery + protected function configureQuery(SelectQuery $query, bool $loadColumns = true, array $outerKeys = []): SelectQuery { - if ($this->isJoined()) { - //Mounting columns - $this->mountColumns($query, $this->options['minify']); - } else { - //This is initial set of columns (remove all existed) - $this->mountColumns($query, $this->options['minify'], '', true); + if ($loadColumns) { + if ($this->isJoined()) { + //Mounting columns + $this->mountColumns($query, $this->options['minify']); + } else { + //This is initial set of columns (remove all existed) + $this->mountColumns($query, $this->options['minify'], '', true); + } } return parent::configureQuery($query); diff --git a/source/Spiral/ORM/Entities/Loaders/RootLoader.php b/source/Spiral/ORM/Entities/Loaders/RootLoader.php index 5b9a6c5..accff76 100644 --- a/source/Spiral/ORM/Entities/Loaders/RootLoader.php +++ b/source/Spiral/ORM/Entities/Loaders/RootLoader.php @@ -120,18 +120,21 @@ public function getAlias(): string /** * @param SelectQuery $query + * @param bool $loadColumns * * @return SelectQuery */ - protected function configureQuery(SelectQuery $query): SelectQuery + protected function configureQuery(SelectQuery $query, bool $loadColumns = true): SelectQuery { //Clarifying table name $query->from("{$this->getTable()} AS {$this->getAlias()}"); //Columns to be loaded for primary model - $this->mountColumns($query, true, '', true); + if ($loadColumns) { + $this->mountColumns($query, true, '', true); + } - return parent::configureQuery($query); + return parent::configureQuery($query, $loadColumns); } /** diff --git a/source/Spiral/ORM/Entities/RecordSelector.php b/source/Spiral/ORM/Entities/RecordSelector.php index 050af30..761b162 100644 --- a/source/Spiral/ORM/Entities/RecordSelector.php +++ b/source/Spiral/ORM/Entities/RecordSelector.php @@ -17,6 +17,7 @@ use Spiral\ORM\Exceptions\SelectorException; use Spiral\ORM\ORMInterface; use Spiral\ORM\RecordInterface; +use Spiral\Pagination\CountingInterface; use Spiral\Pagination\PaginatorAwareInterface; use Spiral\Pagination\PaginatorInterface; @@ -442,13 +443,13 @@ public function compiledQuery(): SelectQuery { return $this->loader->compiledQuery(); } - + /** * Compiled SQL statement. * * @return string */ - public function sqlStatement(): string + public function sqlStatement(): string { return $this->loader->compiledQuery()->sqlStatement(); } @@ -493,7 +494,13 @@ public function setPaginator(PaginatorInterface $paginator) */ public function getPaginator(bool $prepare = true): PaginatorInterface { - return $this->loader->compiledQuery()->getPaginator($prepare); + $paginator = $this->loader->compiledQuery()->getPaginator(false); + + if ($prepare && $paginator instanceof CountingInterface) { + $paginator = $paginator->withCount($this->count()); + } + + return $paginator; } /** diff --git a/source/Spiral/ORM/Entities/Relations/ManyToManyRelation.php b/source/Spiral/ORM/Entities/Relations/ManyToManyRelation.php index c5a5227..28db716 100644 --- a/source/Spiral/ORM/Entities/Relations/ManyToManyRelation.php +++ b/source/Spiral/ORM/Entities/Relations/ManyToManyRelation.php @@ -433,7 +433,7 @@ protected function createQuery($innerKey): SelectQuery //Configuring query using parent inner key value as reference /** @var ManyToManyLoader $loader */ - $query = $loader->configureQuery($query, [$innerKey]); + $query = $loader->configureQuery($query, true, [$innerKey]); //Additional pivot conditions $pivotDecorator = new AliasDecorator($query, 'onWhere', $table->getName() . '_pivot');