Fix #18499: When using yii\db\Query::all() and yii\db\Query::$indexBy, the yii\db\Query::$indexBy is auto inserted into yii\db\Query::$select - the same as in yii\db\Query::column()

Co-authored-by: Bizley <pawel@positive.codes>
Co-authored-by: Alexander Makarov <sam@rmcreative.ru>
This commit is contained in:
Ondřej Vašíček
2021-02-23 16:44:39 +01:00
committed by GitHub
parent 4ed14bb738
commit d1037db68d
7 changed files with 37 additions and 0 deletions

View File

@ -53,6 +53,8 @@ interface ActiveQueryInterface extends QueryInterface
* // return the index value corresponding to $model
* }
* ```
* The column has to be a part of the `SELECT` fragment of a SQL statement.
* If [[yii\db\Query::select()|select()]] is used with an array in its parameter, Yii handles adding that required SQL fragment for you.
*
* @return $this the query object itself
*/

View File

@ -245,7 +245,16 @@ class Query extends Component implements QueryInterface, ExpressionInterface
if ($this->emulateExecution) {
return [];
}
if (is_string($this->indexBy) && $this->indexBy && is_array($this->select) && !in_array($this->indexBy, $this->select)) {
if (strpos($this->indexBy, '.') === false && count($tables = $this->getTablesUsedInFrom()) > 0) {
$this->select[] = key($tables) . '.' . $this->indexBy;
} else {
$this->select[] = $this->indexBy;
}
}
$rows = $this->createCommand($db)->queryAll();
return $this->populate($rows);
}

View File

@ -68,6 +68,8 @@ interface QueryInterface
* // return the index value corresponding to $row
* }
* ```
* The column has to be a part of the `SELECT` fragment of a SQL statement.
* If [[yii\db\Query::select()|select()]] is used with an array in its parameter, Yii handles adding that required SQL fragment for you.
*
* @return $this the query object itself
*/

View File

@ -71,6 +71,8 @@ trait QueryTrait
* // return the index value corresponding to $row
* }
* ```
* The column has to be a part of the `SELECT` fragment of a SQL statement.
* If [[yii\db\Query::select()|select()]] is used with an array in its parameter, Yii handles adding that required SQL fragment for you.
*
* @return $this the query object itself
*/