【问题标题】:What is the difference between double() and float() methods in migraions in Yii2?Yii2 中 migraions 中的 double() 和 float() 方法有什么区别?
【发布时间】:2021-12-04 10:53:43
【问题描述】:

当您在 Yii2 中创建迁移时,您可以使用:

$this->addColumn('table_a', 'value', $this->float()->null());

$this->addColumn('table_a', 'value', $this->double()->null());

但是 Postgres 中的结果是同一种类型:双精度。

有区别吗?

【问题讨论】:

标签: php postgresql yii2


【解决方案1】:

它的作用并不完全相同。

我们来看看implementation这些方法:

public function float($precision = null)
{
    return $this->getDb()->getSchema()->createColumnSchemaBuilder(Schema::TYPE_FLOAT, $precision);
}

public function double($precision = null)
{
    return $this->getDb()->getSchema()->createColumnSchemaBuilder(Schema::TYPE_DOUBLE, $precision);
}

如您所见,两种方法都使用不同的常量来创建ColumnSchemaBuilder 实例。常量的value也不同。

const TYPE_FLOAT = 'float';
const TYPE_DOUBLE = 'double';

那么为什么 Postgres 的结果是一样的呢?原因在于 yii\db\pgsql\QueryBuilder 将两个抽象类型映射到相同的最终类型。

public $typeMap = [
    // ...
    Schema::TYPE_FLOAT => 'double precision',
    Schema::TYPE_DOUBLE => 'double precision',
    // ...
];

这样做是因为抽象。它允许您编写无论应用程序在 Postgres、MySQL 还是 MSSQL 上运行的迁移。

但是,我不知道为什么框架的作者决定将这两种抽象类型都映射到double precision

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2016-05-16
    相关资源
    最近更新 更多