Commit 7e5e3155 by Alexander Makarov

Merge branch 'ar-default-values'

parents 3ab3f996 c24ae25b
......@@ -198,6 +198,15 @@ Customer::updateAllCounters(['age' => 1]);
> Info: The `save()` method will either perform an `INSERT` or `UPDATE` SQL statement, depending
on whether the ActiveRecord being saved is new or not by checking `ActiveRecord::isNewRecord`.
In order to load default values from database schema you may call `loadDefaultValues()` method:
```php
$customer = new Customer();
$customer->loadDefaultValues();
$customer->name = 'Alexander';
$customer->save();
```
Data Input and Validation
-------------------------
......
......@@ -146,6 +146,7 @@ Yii Framework 2 Change Log
- Enh #2661: Added boolean column type support for SQLite (qiangxue)
- Enh #2670: Changed `console\Controller::globalOptions()` to `options($actionId)` to (make it possible to) differentiate options per action (hqx)
- Enh #2714: Added support for formatting time intervals relative to the current time with `yii\base\Formatter` (drenty)
- Enh #2726: Added `yii\db\ActiveRecord::loadDefaultValues()` that fills default values from DB schema (samdark)
- Enh #2729: Added `FilterValidator::skipOnArray` so that filters like `trim` will not fail for array inputs (qiangxue)
- Enh #2735: Added support for `DateTimeInterface` in `Formatter` (ivokund)
- Enh #2756: Added support for injecting custom `isEmpty` check for all validators (qiangxue)
......
......@@ -94,6 +94,21 @@ class ActiveRecord extends BaseActiveRecord
const OP_ALL = 0x07;
/**
* Loads default values from database table schema
*
* @return static model instance
*/
public function loadDefaultValues()
{
foreach ($this->getTableSchema()->columns as $column) {
if ($column->defaultValue) {
$this->{$column->name} = $column->defaultValue;
}
}
return $this;
}
/**
* Returns the database connection used by this AR class.
* By default, the "db" application component is used as the database connection.
* You may override this method if you want to use a different database connection.
......
......@@ -373,6 +373,12 @@ SQL;
$table->sequenceName = preg_replace(['/nextval/', '/::/', '/regclass/', '/\'\)/', '/\(\'/'], '', $column->defaultValue);
}
}
if ($column->defaultValue) {
if (preg_match("/^'(.*?)'::/", $column->defaultValue, $matches) || preg_match("/^(.*?)::/", $column->defaultValue, $matches)) {
$column->defaultValue = $matches[1];
}
}
}
return true;
......@@ -398,7 +404,6 @@ SQL;
$column->precision = $info['numeric_precision'];
$column->scale = $info['numeric_scale'];
$column->size = $info['size'];
if (isset($this->typeMap[$column->dbType])) {
$column->type = $this->typeMap[$column->dbType];
} else {
......@@ -406,6 +411,7 @@ SQL;
}
$column->phpType = $this->getColumnPhpType($column);
return $column;
}
}
......@@ -238,9 +238,9 @@ class Schema extends \yii\db\Schema
}
$column->phpType = $this->getColumnPhpType($column);
$value = $info['dflt_value'];
$value = trim($info['dflt_value'], "'\"");
if ($column->type === 'string') {
$column->defaultValue = trim($value, "'\"");
$column->defaultValue = $value;
} else {
$column->defaultValue = $column->typecast(strcasecmp($value, 'null') ? $value : null);
}
......
<?php
namespace yiiunit\data\ar;
/**
* Model representing tbl_type table
*
* @property int $int_col
* @property int $int_col2 DEFAULT 1
* @property string $char_col
* @property string $char_col2 DEFAULT 'something'
* @property string $char_col3
* @property float $float_col
* @property float $float_col2 DEFAULT '1.23'
* @property string $blob_col
* @property float $numeric_col DEFAULT '33.22'
* @property string $time DEFAULT '2002-01-01 00:00:00'
* @property boolean $bool_col
* @property boolean $bool_col2 DEFAULT 1
*/
class Type extends ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'tbl_type';
}
}
\ No newline at end of file
......@@ -8,6 +8,7 @@ use yiiunit\data\ar\OrderItem;
use yiiunit\data\ar\Order;
use yiiunit\data\ar\Item;
use yiiunit\data\ar\Profile;
use yiiunit\data\ar\Type;
use yiiunit\framework\ar\ActiveRecordTestTrait;
/**
......@@ -486,4 +487,16 @@ class ActiveRecordTest extends DatabaseTestCase
$this->assertTrue($orders[1]['customer2']['orders2'][0]['id'] === $orders[0]['id']);
$this->assertTrue($orders[1]['customer2']['orders2'][1]['id'] === $orders[1]['id']);
}
public function testDefaultValues()
{
$model = new Type();
$model->loadDefaultValues();
$this->assertEquals(1, $model->int_col2);
$this->assertEquals('something', $model->char_col2);
$this->assertEquals(1.23, $model->float_col2);
$this->assertEquals(33.22, $model->numeric_col);
$this->assertEquals('2002-01-01 00:00:00', $model->time);
$this->assertEquals(true, $model->bool_col2);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment