Fixes #15482: AR::find()->with() missing data when using string identifiers for relations

This commit is contained in:
Pavel Ivanov
2019-01-15 01:50:56 +02:00
committed by Alexander Makarov
parent 63faf5f593
commit 4333b90186
8 changed files with 189 additions and 1 deletions

View File

@ -4,6 +4,7 @@ Yii Framework 2 Change Log
2.0.16 under development 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 #15167: Fixed loading of default value `current_timestamp()` for MariaDB >= 10.2.3 (rugabarbo, bloodrain777, Skinka)
- Bug #16253: Fixed empty checkboxlist validation (GHopperMSK) - Bug #16253: Fixed empty checkboxlist validation (GHopperMSK)
- Bug #15286: Fixed incorrect formatting of time with timezone information (rugabarbo) - Bug #15286: Fixed incorrect formatting of time with timezone information (rugabarbo)

View File

@ -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
View 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
View 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']);
}
}

View File

@ -24,6 +24,8 @@ DROP TABLE IF EXISTS `dossier`;
DROP TABLE IF EXISTS `employee`; DROP TABLE IF EXISTS `employee`;
DROP TABLE IF EXISTS `department`; DROP TABLE IF EXISTS `department`;
DROP TABLE IF EXISTS `storage`; DROP TABLE IF EXISTS `storage`;
DROP TABLE IF EXISTS `alpha`;
DROP TABLE IF EXISTS `beta`;
DROP VIEW IF EXISTS `animal_view`; DROP VIEW IF EXISTS `animal_view`;
DROP TABLE IF EXISTS `T_constraints_4` CASCADE; DROP TABLE IF EXISTS `T_constraints_4` CASCADE;
DROP TABLE IF EXISTS `T_constraints_3` CASCADE; DROP TABLE IF EXISTS `T_constraints_3` CASCADE;
@ -209,6 +211,18 @@ CREATE TABLE `storage` (
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) 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`; CREATE VIEW `animal_view` AS SELECT * FROM `animal`;
INSERT INTO `animal` (`type`) VALUES ('yiiunit\data\ar\Cat'); 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 (2, 2, 1, 'Brilliant employee.');
INSERT INTO `dossier` (id, department_id, employee_id, summary) VALUES (3, 2, 2, 'Good 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 * (MySQL-)Database Schema for validator tests

View File

@ -25,6 +25,8 @@ DROP TABLE IF EXISTS "comment" CASCADE;
DROP TABLE IF EXISTS "dossier"; DROP TABLE IF EXISTS "dossier";
DROP TABLE IF EXISTS "employee"; DROP TABLE IF EXISTS "employee";
DROP TABLE IF EXISTS "department"; DROP TABLE IF EXISTS "department";
DROP TABLE IF EXISTS "alpha";
DROP TABLE IF EXISTS "beta";
DROP VIEW IF EXISTS "animal_view"; DROP VIEW IF EXISTS "animal_view";
DROP TABLE IF EXISTS "T_constraints_4"; DROP TABLE IF EXISTS "T_constraints_4";
DROP TABLE IF EXISTS "T_constraints_3"; DROP TABLE IF EXISTS "T_constraints_3";
@ -207,6 +209,18 @@ CREATE TABLE "dossier" (
summary VARCHAR(255) NOT NULL 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"; CREATE VIEW "animal_view" AS SELECT * FROM "animal";
INSERT INTO "animal" (type) VALUES ('yiiunit\data\ar\Cat'); 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 (2, 2, 1, 'Brilliant employee.');
INSERT INTO "dossier" (id, department_id, employee_id, summary) VALUES (3, 2, 2, 'Good 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 * (Postgres-)Database Schema for validator tests
*/ */

View File

@ -21,6 +21,8 @@ DROP TABLE IF EXISTS "document";
DROP TABLE IF EXISTS "dossier"; DROP TABLE IF EXISTS "dossier";
DROP TABLE IF EXISTS "employee"; DROP TABLE IF EXISTS "employee";
DROP TABLE IF EXISTS "department"; DROP TABLE IF EXISTS "department";
DROP TABLE IF EXISTS "alpha";
DROP TABLE IF EXISTS "beta";
DROP VIEW IF EXISTS "animal_view"; DROP VIEW IF EXISTS "animal_view";
DROP TABLE IF EXISTS "T_constraints_4"; DROP TABLE IF EXISTS "T_constraints_4";
DROP TABLE IF EXISTS "T_constraints_3"; DROP TABLE IF EXISTS "T_constraints_3";
@ -173,6 +175,18 @@ CREATE TABLE "dossier" (
PRIMARY KEY (id) 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"; CREATE VIEW "animal_view" AS SELECT * FROM "animal";
INSERT INTO "animal" ("type") VALUES ('yiiunit\data\ar\Cat'); 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 (2, 2, 1, 'Brilliant employee.');
INSERT INTO "dossier" (id, department_id, employee_id, summary) VALUES (3, 2, 2, 'Good 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 * (SqLite-)Database Schema for validator tests
*/ */

View File

@ -12,6 +12,7 @@ use yii\db\Query;
use yii\helpers\ArrayHelper; use yii\helpers\ArrayHelper;
use yiiunit\data\ar\ActiveRecord; use yiiunit\data\ar\ActiveRecord;
use yiiunit\data\ar\Animal; use yiiunit\data\ar\Animal;
use yiiunit\data\ar\Beta;
use yiiunit\data\ar\BitValues; use yiiunit\data\ar\BitValues;
use yiiunit\data\ar\Cat; use yiiunit\data\ar\Cat;
use yiiunit\data\ar\Category; use yiiunit\data\ar\Category;
@ -1815,4 +1816,28 @@ abstract class ActiveRecordTest extends DatabaseTestCase
$this->assertFalse(isset($cat->throwable)); $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);
}
} }