mirror of
https://github.com/yiisoft/yii2.git
synced 2025-08-26 06:15:19 +08:00
Fixes #15482: AR::find()->with() missing data when using string identifiers for relations
This commit is contained in:

committed by
Alexander Makarov

parent
63faf5f593
commit
4333b90186
@ -4,6 +4,7 @@ Yii Framework 2 Change Log
|
||||
2.0.16 under development
|
||||
------------------------
|
||||
|
||||
- Bug #15482: AR::find()->with() missing data when using string identifiers for relations (rugabarbo)
|
||||
- Bug #15167: Fixed loading of default value `current_timestamp()` for MariaDB >= 10.2.3 (rugabarbo, bloodrain777, Skinka)
|
||||
- Bug #16253: Fixed empty checkboxlist validation (GHopperMSK)
|
||||
- Bug #15286: Fixed incorrect formatting of time with timezone information (rugabarbo)
|
||||
|
@ -551,7 +551,23 @@ trait ActiveRelationTrait
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->andWhere(['in', $attributes, array_unique($values, SORT_REGULAR)]);
|
||||
|
||||
if (!empty($values)) {
|
||||
$scalarValues = [];
|
||||
$nonScalarValues = [];
|
||||
foreach ($values as $value) {
|
||||
if (is_scalar($value)) {
|
||||
$scalarValues[] = $value;
|
||||
} else {
|
||||
$nonScalarValues[] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
$scalarValues = array_unique($scalarValues);
|
||||
$values = array_merge($scalarValues, $nonScalarValues);
|
||||
}
|
||||
|
||||
$this->andWhere(['in', $attributes, $values]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
25
tests/data/ar/Alpha.php
Normal file
25
tests/data/ar/Alpha.php
Normal file
@ -0,0 +1,25 @@
|
||||
<?php
|
||||
/**
|
||||
* @link http://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license http://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yiiunit\data\ar;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
* @property string $string_identifier
|
||||
*/
|
||||
class Alpha extends ActiveRecord
|
||||
{
|
||||
public static function tableName()
|
||||
{
|
||||
return 'alpha';
|
||||
}
|
||||
|
||||
public function getBetas()
|
||||
{
|
||||
return $this->hasMany(Beta::className(), ['alpha_string_identifier' => 'string_identifier']);
|
||||
}
|
||||
}
|
26
tests/data/ar/Beta.php
Normal file
26
tests/data/ar/Beta.php
Normal file
@ -0,0 +1,26 @@
|
||||
<?php
|
||||
/**
|
||||
* @link http://www.yiiframework.com/
|
||||
* @copyright Copyright (c) 2008 Yii Software LLC
|
||||
* @license http://www.yiiframework.com/license/
|
||||
*/
|
||||
|
||||
namespace yiiunit\data\ar;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
* @property string $alpha_string_identifier
|
||||
* @property Alpha $alpha
|
||||
*/
|
||||
class Beta extends ActiveRecord
|
||||
{
|
||||
public static function tableName()
|
||||
{
|
||||
return 'beta';
|
||||
}
|
||||
|
||||
public function getAlpha()
|
||||
{
|
||||
return $this->hasOne(Alpha::className(), ['string_identifier' => 'alpha_string_identifier']);
|
||||
}
|
||||
}
|
@ -24,6 +24,8 @@ DROP TABLE IF EXISTS `dossier`;
|
||||
DROP TABLE IF EXISTS `employee`;
|
||||
DROP TABLE IF EXISTS `department`;
|
||||
DROP TABLE IF EXISTS `storage`;
|
||||
DROP TABLE IF EXISTS `alpha`;
|
||||
DROP TABLE IF EXISTS `beta`;
|
||||
DROP VIEW IF EXISTS `animal_view`;
|
||||
DROP TABLE IF EXISTS `T_constraints_4` CASCADE;
|
||||
DROP TABLE IF EXISTS `T_constraints_3` CASCADE;
|
||||
@ -209,6 +211,18 @@ CREATE TABLE `storage` (
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE `alpha` (
|
||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`string_identifier` VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE `beta` (
|
||||
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`alpha_string_identifier` VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE VIEW `animal_view` AS SELECT * FROM `animal`;
|
||||
|
||||
INSERT INTO `animal` (`type`) VALUES ('yiiunit\data\ar\Cat');
|
||||
@ -265,6 +279,23 @@ INSERT INTO `dossier` (id, department_id, employee_id, summary) VALUES (1, 1, 1,
|
||||
INSERT INTO `dossier` (id, department_id, employee_id, summary) VALUES (2, 2, 1, 'Brilliant employee.');
|
||||
INSERT INTO `dossier` (id, department_id, employee_id, summary) VALUES (3, 2, 2, 'Good employee.');
|
||||
|
||||
INSERT INTO `alpha` (id, string_identifier) VALUES (1, '1');
|
||||
INSERT INTO `alpha` (id, string_identifier) VALUES (2, '1a');
|
||||
INSERT INTO `alpha` (id, string_identifier) VALUES (3, '01');
|
||||
INSERT INTO `alpha` (id, string_identifier) VALUES (4, '001');
|
||||
INSERT INTO `alpha` (id, string_identifier) VALUES (5, '2');
|
||||
INSERT INTO `alpha` (id, string_identifier) VALUES (6, '2b');
|
||||
INSERT INTO `alpha` (id, string_identifier) VALUES (7, '02');
|
||||
INSERT INTO `alpha` (id, string_identifier) VALUES (8, '002');
|
||||
|
||||
INSERT INTO `beta` (id, alpha_string_identifier) VALUES (1, '1');
|
||||
INSERT INTO `beta` (id, alpha_string_identifier) VALUES (2, '01');
|
||||
INSERT INTO `beta` (id, alpha_string_identifier) VALUES (3, '001');
|
||||
INSERT INTO `beta` (id, alpha_string_identifier) VALUES (4, '001');
|
||||
INSERT INTO `beta` (id, alpha_string_identifier) VALUES (5, '2');
|
||||
INSERT INTO `beta` (id, alpha_string_identifier) VALUES (6, '2b');
|
||||
INSERT INTO `beta` (id, alpha_string_identifier) VALUES (7, '2b');
|
||||
INSERT INTO `beta` (id, alpha_string_identifier) VALUES (8, '02');
|
||||
|
||||
/**
|
||||
* (MySQL-)Database Schema for validator tests
|
||||
|
@ -25,6 +25,8 @@ DROP TABLE IF EXISTS "comment" CASCADE;
|
||||
DROP TABLE IF EXISTS "dossier";
|
||||
DROP TABLE IF EXISTS "employee";
|
||||
DROP TABLE IF EXISTS "department";
|
||||
DROP TABLE IF EXISTS "alpha";
|
||||
DROP TABLE IF EXISTS "beta";
|
||||
DROP VIEW IF EXISTS "animal_view";
|
||||
DROP TABLE IF EXISTS "T_constraints_4";
|
||||
DROP TABLE IF EXISTS "T_constraints_3";
|
||||
@ -207,6 +209,18 @@ CREATE TABLE "dossier" (
|
||||
summary VARCHAR(255) NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE "alpha" (
|
||||
id INTEGER NOT NULL,
|
||||
string_identifier VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
CREATE TABLE "beta" (
|
||||
id INTEGER NOT NULL,
|
||||
alpha_string_identifier VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
CREATE VIEW "animal_view" AS SELECT * FROM "animal";
|
||||
|
||||
INSERT INTO "animal" (type) VALUES ('yiiunit\data\ar\Cat');
|
||||
@ -267,6 +281,24 @@ INSERT INTO "dossier" (id, department_id, employee_id, summary) VALUES (1, 1, 1,
|
||||
INSERT INTO "dossier" (id, department_id, employee_id, summary) VALUES (2, 2, 1, 'Brilliant employee.');
|
||||
INSERT INTO "dossier" (id, department_id, employee_id, summary) VALUES (3, 2, 2, 'Good employee.');
|
||||
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (1, '1');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (2, '1a');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (3, '01');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (4, '001');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (5, '2');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (6, '2b');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (7, '02');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (8, '002');
|
||||
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (1, '1');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (2, '01');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (3, '001');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (4, '001');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (5, '2');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (6, '2b');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (7, '2b');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (8, '02');
|
||||
|
||||
/**
|
||||
* (Postgres-)Database Schema for validator tests
|
||||
*/
|
||||
|
@ -21,6 +21,8 @@ DROP TABLE IF EXISTS "document";
|
||||
DROP TABLE IF EXISTS "dossier";
|
||||
DROP TABLE IF EXISTS "employee";
|
||||
DROP TABLE IF EXISTS "department";
|
||||
DROP TABLE IF EXISTS "alpha";
|
||||
DROP TABLE IF EXISTS "beta";
|
||||
DROP VIEW IF EXISTS "animal_view";
|
||||
DROP TABLE IF EXISTS "T_constraints_4";
|
||||
DROP TABLE IF EXISTS "T_constraints_3";
|
||||
@ -173,6 +175,18 @@ CREATE TABLE "dossier" (
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
CREATE TABLE "alpha" (
|
||||
id INTEGER NOT NULL,
|
||||
string_identifier VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
CREATE TABLE "beta" (
|
||||
id INTEGER NOT NULL,
|
||||
alpha_string_identifier VARCHAR(255) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
CREATE VIEW "animal_view" AS SELECT * FROM "animal";
|
||||
|
||||
INSERT INTO "animal" ("type") VALUES ('yiiunit\data\ar\Cat');
|
||||
@ -229,6 +243,24 @@ INSERT INTO "dossier" (id, department_id, employee_id, summary) VALUES (1, 1, 1,
|
||||
INSERT INTO "dossier" (id, department_id, employee_id, summary) VALUES (2, 2, 1, 'Brilliant employee.');
|
||||
INSERT INTO "dossier" (id, department_id, employee_id, summary) VALUES (3, 2, 2, 'Good employee.');
|
||||
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (1, '1');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (2, '1a');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (3, '01');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (4, '001');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (5, '2');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (6, '2b');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (7, '02');
|
||||
INSERT INTO "alpha" (id, string_identifier) VALUES (8, '002');
|
||||
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (1, '1');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (2, '01');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (3, '001');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (4, '001');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (5, '2');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (6, '2b');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (7, '2b');
|
||||
INSERT INTO "beta" (id, alpha_string_identifier) VALUES (8, '02');
|
||||
|
||||
/**
|
||||
* (SqLite-)Database Schema for validator tests
|
||||
*/
|
||||
|
@ -12,6 +12,7 @@ use yii\db\Query;
|
||||
use yii\helpers\ArrayHelper;
|
||||
use yiiunit\data\ar\ActiveRecord;
|
||||
use yiiunit\data\ar\Animal;
|
||||
use yiiunit\data\ar\Beta;
|
||||
use yiiunit\data\ar\BitValues;
|
||||
use yiiunit\data\ar\Cat;
|
||||
use yiiunit\data\ar\Category;
|
||||
@ -1815,4 +1816,28 @@ abstract class ActiveRecordTest extends DatabaseTestCase
|
||||
$this->assertFalse(isset($cat->throwable));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @see https://github.com/yiisoft/yii2/issues/15482
|
||||
*/
|
||||
public function testEagerLoadingUsingStringIdentifiers()
|
||||
{
|
||||
if (!in_array($this->driverName, ['mysql', 'pgsql', 'sqlite'])) {
|
||||
$this->markTestSkipped('This test has fixtures only for databases MySQL, PostgreSQL and SQLite.');
|
||||
}
|
||||
|
||||
$betas = Beta::find()->with('alpha')->all();
|
||||
$this->assertNotEmpty($betas);
|
||||
|
||||
$alphaIdentifiers = [];
|
||||
|
||||
/** @var Beta[] $betas */
|
||||
foreach ($betas as $beta) {
|
||||
$this->assertNotNull($beta->alpha);
|
||||
$this->assertEquals($beta->alpha_string_identifier, $beta->alpha->string_identifier);
|
||||
$alphaIdentifiers[] = $beta->alpha->string_identifier;
|
||||
}
|
||||
|
||||
$this->assertEquals(['1', '01', '001', '001', '2', '2b', '2b', '02'], $alphaIdentifiers);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user