mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-10 23:50:38 +08:00
Fixes #13019: Support JSON in SchemaBuilderTrait
This commit is contained in:
committed by
Alexander Makarov
parent
46848f0051
commit
40b038379f
18
.travis.yml
18
.travis.yml
@@ -49,6 +49,11 @@ cache:
|
|||||||
# try running against postgres 9.6
|
# try running against postgres 9.6
|
||||||
addons:
|
addons:
|
||||||
postgresql: "9.6"
|
postgresql: "9.6"
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
- mysql-5.7-trusty
|
||||||
|
packages:
|
||||||
|
- mysql-server
|
||||||
code_climate:
|
code_climate:
|
||||||
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
|
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
|
||||||
|
|
||||||
@@ -76,10 +81,10 @@ matrix:
|
|||||||
code_climate:
|
code_climate:
|
||||||
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
|
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
|
||||||
apt:
|
apt:
|
||||||
|
sources:
|
||||||
|
- mysql-5.7-trusty
|
||||||
packages:
|
packages:
|
||||||
- mysql-server-5.6
|
- mysql-server
|
||||||
- mysql-client-core-5.6
|
|
||||||
- mysql-client-5.6
|
|
||||||
services:
|
services:
|
||||||
- mysql
|
- mysql
|
||||||
|
|
||||||
@@ -91,10 +96,10 @@ matrix:
|
|||||||
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
|
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
|
||||||
postgresql: "9.6"
|
postgresql: "9.6"
|
||||||
apt:
|
apt:
|
||||||
|
sources:
|
||||||
|
- mysql-5.7-trusty
|
||||||
packages:
|
packages:
|
||||||
- mysql-server-5.6
|
- mysql-server
|
||||||
- mysql-client-core-5.6
|
|
||||||
- mysql-client-5.6
|
|
||||||
services:
|
services:
|
||||||
- mysql
|
- mysql
|
||||||
- postgresql
|
- postgresql
|
||||||
@@ -166,6 +171,7 @@ before_script:
|
|||||||
- |
|
- |
|
||||||
if [ $TASK_TESTS_PHP == 1 ]; then
|
if [ $TASK_TESTS_PHP == 1 ]; then
|
||||||
travis_retry mysql -e 'CREATE DATABASE `yiitest`;';
|
travis_retry mysql -e 'CREATE DATABASE `yiitest`;';
|
||||||
|
mysql -e "SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';";
|
||||||
mysql -e "CREATE USER 'travis'@'localhost' IDENTIFIED WITH mysql_native_password;";
|
mysql -e "CREATE USER 'travis'@'localhost' IDENTIFIED WITH mysql_native_password;";
|
||||||
mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'travis'@'localhost' WITH GRANT OPTION;";
|
mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'travis'@'localhost' WITH GRANT OPTION;";
|
||||||
psql -U postgres -c 'CREATE DATABASE yiitest;';
|
psql -U postgres -c 'CREATE DATABASE yiitest;';
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ Yii Framework 2 Change Log
|
|||||||
2.0.14 under development
|
2.0.14 under development
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
- Enh #13019: Support JSON in SchemaBuilderTrait (zhukovra, undefinedor)
|
||||||
- Enh #15047: `yii\db\Query::select()` and `yii\db\Query::addSelect()` now check for duplicate column names (wapmorgan)
|
- Enh #15047: `yii\db\Query::select()` and `yii\db\Query::addSelect()` now check for duplicate column names (wapmorgan)
|
||||||
- Enh #14643: Added `yii\web\ErrorAction::$layout` property to conveniently set layout from error action config (swods, cebe, samdark)
|
- Enh #14643: Added `yii\web\ErrorAction::$layout` property to conveniently set layout from error action config (swods, cebe, samdark)
|
||||||
- Enh #13465: Added `yii\helpers\FileHelper::findDirectory()` method (ArsSirek, developeruz)
|
- Enh #13465: Added `yii\helpers\FileHelper::findDirectory()` method (ArsSirek, developeruz)
|
||||||
|
|||||||
@@ -114,13 +114,33 @@ class ColumnSchema extends BaseObject
|
|||||||
*/
|
*/
|
||||||
protected function typecast($value)
|
protected function typecast($value)
|
||||||
{
|
{
|
||||||
if ($value === '' && !in_array($this->type, [Schema::TYPE_TEXT, Schema::TYPE_STRING, Schema::TYPE_BINARY, Schema::TYPE_CHAR], true)) {
|
if ($value === ''
|
||||||
|
&& !in_array(
|
||||||
|
$this->type,
|
||||||
|
[
|
||||||
|
Schema::TYPE_TEXT,
|
||||||
|
Schema::TYPE_STRING,
|
||||||
|
Schema::TYPE_BINARY,
|
||||||
|
Schema::TYPE_CHAR
|
||||||
|
],
|
||||||
|
true)
|
||||||
|
) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if ($value === null || gettype($value) === $this->phpType || $value instanceof ExpressionInterface || $value instanceof Query) {
|
|
||||||
|
if ($value === null
|
||||||
|
|| gettype($value) === $this->phpType
|
||||||
|
|| $value instanceof ExpressionInterface
|
||||||
|
|| $value instanceof Query
|
||||||
|
) {
|
||||||
return $value;
|
return $value;
|
||||||
}
|
}
|
||||||
if (is_array($value) && count($value) === 2 && isset($value[1]) && in_array($value[1], $this->getPdoParamTypes(), true)) {
|
|
||||||
|
if (is_array($value)
|
||||||
|
&& count($value) === 2
|
||||||
|
&& isset($value[1])
|
||||||
|
&& in_array($value[1], $this->getPdoParamTypes(), true)
|
||||||
|
) {
|
||||||
return new PdoValue($value[0], $value[1]);
|
return new PdoValue($value[0], $value[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -272,4 +272,25 @@ trait SchemaBuilderTrait
|
|||||||
|
|
||||||
return $this->getDb()->getSchema()->createColumnSchemaBuilder(Schema::TYPE_MONEY, $length);
|
return $this->getDb()->getSchema()->createColumnSchemaBuilder(Schema::TYPE_MONEY, $length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a JSON column.
|
||||||
|
* @return ColumnSchemaBuilder the column instance which can be further customized.
|
||||||
|
* @since 2.0.14
|
||||||
|
* @throws \yii\base\Exception
|
||||||
|
*/
|
||||||
|
public function json()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* TODO Remove in Yii 2.1
|
||||||
|
*
|
||||||
|
* Disabled due to bug in MySQL extension
|
||||||
|
* @link https://bugs.php.net/bug.php?id=70384
|
||||||
|
*/
|
||||||
|
if (version_compare(PHP_VERSION, '5.6', '<') && $this->getDb()->getDriverName() === 'mysql') {
|
||||||
|
throw new \yii\base\Exception('JSON column type is not supported in PHP < 5.6');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->getDb()->getSchema()->createColumnSchemaBuilder(Schema::TYPE_JSON);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ class QueryBuilder extends \yii\db\QueryBuilder
|
|||||||
Schema::TYPE_BINARY => 'blob',
|
Schema::TYPE_BINARY => 'blob',
|
||||||
Schema::TYPE_BOOLEAN => 'tinyint(1)',
|
Schema::TYPE_BOOLEAN => 'tinyint(1)',
|
||||||
Schema::TYPE_MONEY => 'decimal(19,4)',
|
Schema::TYPE_MONEY => 'decimal(19,4)',
|
||||||
|
Schema::TYPE_JSON => 'json'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ class Schema extends \yii\db\Schema
|
|||||||
'timestamp' => self::TYPE_TIMESTAMP,
|
'timestamp' => self::TYPE_TIMESTAMP,
|
||||||
'enum' => self::TYPE_STRING,
|
'enum' => self::TYPE_STRING,
|
||||||
'varbinary' => self::TYPE_BINARY,
|
'varbinary' => self::TYPE_BINARY,
|
||||||
|
'json' => self::TYPE_JSON,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ class QueryBuilder extends \yii\db\QueryBuilder
|
|||||||
Schema::TYPE_BINARY => 'bytea',
|
Schema::TYPE_BINARY => 'bytea',
|
||||||
Schema::TYPE_BOOLEAN => 'boolean',
|
Schema::TYPE_BOOLEAN => 'boolean',
|
||||||
Schema::TYPE_MONEY => 'numeric(19,4)',
|
Schema::TYPE_MONEY => 'numeric(19,4)',
|
||||||
Schema::TYPE_JSON => 'jsonb'
|
Schema::TYPE_JSON => 'jsonb',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -142,7 +142,8 @@ CREATE TABLE `type` (
|
|||||||
`bool_col` tinyint(1) NOT NULL,
|
`bool_col` tinyint(1) NOT NULL,
|
||||||
`bool_col2` tinyint(1) DEFAULT '1',
|
`bool_col2` tinyint(1) DEFAULT '1',
|
||||||
`ts_default` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
`ts_default` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
`bit_col` BIT(8) NOT NULL DEFAULT b'10000010'
|
`bit_col` BIT(8) NOT NULL DEFAULT b'10000010',
|
||||||
|
`json_col` json
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
CREATE TABLE `animal` (
|
CREATE TABLE `animal` (
|
||||||
|
|||||||
@@ -1128,6 +1128,9 @@ abstract class ActiveRecordTest extends DatabaseTestCase
|
|||||||
$this->assertEquals(5, $itemClass::find()->count());
|
$this->assertEquals(5, $itemClass::find()->count());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @requires PHP 5.6
|
||||||
|
*/
|
||||||
public function testCastValues()
|
public function testCastValues()
|
||||||
{
|
{
|
||||||
$model = new Type();
|
$model = new Type();
|
||||||
|
|||||||
@@ -442,6 +442,18 @@ abstract class SchemaTest extends DatabaseTestCase
|
|||||||
'scale' => null,
|
'scale' => null,
|
||||||
'defaultValue' => 130, // b'10000010'
|
'defaultValue' => 130, // b'10000010'
|
||||||
],
|
],
|
||||||
|
'json_col' => [
|
||||||
|
'type' => 'json',
|
||||||
|
'dbType' => 'json',
|
||||||
|
'phpType' => 'array',
|
||||||
|
'allowNull' => true,
|
||||||
|
'autoIncrement' => false,
|
||||||
|
'enumValues' => null,
|
||||||
|
'size' => null,
|
||||||
|
'precision' => null,
|
||||||
|
'scale' => null,
|
||||||
|
'defaultValue' => null,
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ class SchemaTest extends \yiiunit\framework\db\SchemaTest
|
|||||||
public function getExpectedColumns()
|
public function getExpectedColumns()
|
||||||
{
|
{
|
||||||
$columns = parent::getExpectedColumns();
|
$columns = parent::getExpectedColumns();
|
||||||
|
unset($columns['json_col']);
|
||||||
$columns['int_col']['dbType'] = 'integer';
|
$columns['int_col']['dbType'] = 'integer';
|
||||||
$columns['int_col']['size'] = null;
|
$columns['int_col']['size'] = null;
|
||||||
$columns['int_col']['precision'] = null;
|
$columns['int_col']['precision'] = null;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class QueryBuilderTest extends \yiiunit\framework\db\QueryBuilderTest
|
|||||||
*/
|
*/
|
||||||
public function columnTypes()
|
public function columnTypes()
|
||||||
{
|
{
|
||||||
return array_merge(parent::columnTypes(), [
|
$columns = [
|
||||||
[
|
[
|
||||||
Schema::TYPE_PK . ' AFTER `col_before`',
|
Schema::TYPE_PK . ' AFTER `col_before`',
|
||||||
$this->primaryKey()->after('col_before'),
|
$this->primaryKey()->after('col_before'),
|
||||||
@@ -62,7 +62,23 @@ class QueryBuilderTest extends \yiiunit\framework\db\QueryBuilderTest
|
|||||||
$this->primaryKey()->comment('test')->after('col_before'),
|
$this->primaryKey()->comment('test')->after('col_before'),
|
||||||
"int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'test' AFTER `col_before`",
|
"int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'test' AFTER `col_before`",
|
||||||
],
|
],
|
||||||
]);
|
];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO Remove in Yii 2.1
|
||||||
|
*
|
||||||
|
* Disabled due bug in MySQL extension
|
||||||
|
* @link https://bugs.php.net/bug.php?id=70384
|
||||||
|
*/
|
||||||
|
if (version_compare(PHP_VERSION, '5.6', '>=')) {
|
||||||
|
$columns[] = [
|
||||||
|
Schema::TYPE_JSON,
|
||||||
|
$this->json(),
|
||||||
|
"json",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_merge(parent::columnTypes(), $columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function primaryKeysProvider()
|
public function primaryKeysProvider()
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ class SchemaTest extends \yiiunit\framework\db\SchemaTest
|
|||||||
{
|
{
|
||||||
$columns = parent::getExpectedColumns();
|
$columns = parent::getExpectedColumns();
|
||||||
unset($columns['enum_col']);
|
unset($columns['enum_col']);
|
||||||
|
unset($columns['json_col']);
|
||||||
$columns['int_col']['dbType'] = 'NUMBER';
|
$columns['int_col']['dbType'] = 'NUMBER';
|
||||||
$columns['int_col']['size'] = 22;
|
$columns['int_col']['size'] = 22;
|
||||||
$columns['int_col']['precision'] = null;
|
$columns['int_col']['precision'] = null;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ class QueryBuilderTest extends \yiiunit\framework\db\QueryBuilderTest
|
|||||||
|
|
||||||
public function columnTypes()
|
public function columnTypes()
|
||||||
{
|
{
|
||||||
return array_merge(parent::columnTypes(), [
|
$columns = [
|
||||||
[
|
[
|
||||||
Schema::TYPE_BOOLEAN . ' NOT NULL DEFAULT TRUE',
|
Schema::TYPE_BOOLEAN . ' NOT NULL DEFAULT TRUE',
|
||||||
$this->boolean()->notNull()->defaultValue(true),
|
$this->boolean()->notNull()->defaultValue(true),
|
||||||
@@ -57,7 +57,14 @@ class QueryBuilderTest extends \yiiunit\framework\db\QueryBuilderTest
|
|||||||
$this->timestamp(4),
|
$this->timestamp(4),
|
||||||
'timestamp(4)',
|
'timestamp(4)',
|
||||||
],
|
],
|
||||||
]);
|
[
|
||||||
|
Schema::TYPE_JSON,
|
||||||
|
$this->json(),
|
||||||
|
"jsonb",
|
||||||
|
],
|
||||||
|
];
|
||||||
|
|
||||||
|
return array_merge(parent::columnTypes(), $columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function conditionProvider()
|
public function conditionProvider()
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class SchemaTest extends \yiiunit\framework\db\SchemaTest
|
|||||||
$columns = parent::getExpectedColumns();
|
$columns = parent::getExpectedColumns();
|
||||||
unset($columns['enum_col']);
|
unset($columns['enum_col']);
|
||||||
unset($columns['bit_col']);
|
unset($columns['bit_col']);
|
||||||
|
unset($columns['json_col']);
|
||||||
$columns['int_col']['dbType'] = 'integer';
|
$columns['int_col']['dbType'] = 'integer';
|
||||||
$columns['int_col']['size'] = null;
|
$columns['int_col']['size'] = null;
|
||||||
$columns['int_col']['precision'] = null;
|
$columns['int_col']['precision'] = null;
|
||||||
|
|||||||
Reference in New Issue
Block a user