Yii2 中 migraions 中的 double() 和 float() 方法有什么区别?

What is the difference between double() and float() methods in migraions in Yii2?

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

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

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

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

有区别吗?

不完全一样。

让我们来看看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