Миграции CakePHP — как указать масштаб и точность

#cakephp #migration #cakephp-2.7

#cakephp #миграция #cakephp-2.7

Вопрос:

Я использую CakePHP 2.7 с плагином миграции и базой данных Postgresql. Создание поля типа ‘number’ и указание длины 15,4 (масштаб 15, точность 4 — или любая длина) фактически не создает поле с такой точностью и / или масштабом.

           ...
 'license_fee' => array(
   'type' => 'number',
   'null' => true,
   'length' => '15,6',
   'default' => 0
  ),
        ...
  

Поле создается с правильным типом (числовым), но без масштаба / точности. вот описание Postgres созданного поля.

 license_fee               | numeric | default 0
  

То, что я ожидал увидеть, это

 license_fee               | numeric(15,6) | default 0
  

Я также пытался использовать ‘type’ => ‘decimal’, но произошло то же самое. Это может не поддерживаться плагином миграции, но я просто хочу знать, знает ли кто-нибудь наверняка, что происходит.

Комментарии:

1. Я боюсь, что плагин 2.x не может быть и никогда не станет достаточно мощным, чтобы поддерживать все эти случаи. В плагине миграции 3.x все это исправлено по дизайну. Возможно, вы захотите переключиться здесь. Кстати, я только что опубликовал пост о том, как использовать миграции 3.x в приложениях 2.x .

Ответ №1:

Найдено здесь: http://docs.phinx.org/en/latest/migrations.html

Для того, чтобы создать: десятичное число (9,3)

 $table->addColumn('distance', 'decimal', [
            'default' => null,
            'null' => false,
            'precision'=>9,
            'scale'=>3
        ]);
  

Комментарии:

1. Этот ответ не относится к платформе CakePHP, которую я использую.

2. Это правильный ответ для CakePHP 3.5 и MySQL. Принятый ответ не сработал для меня.

3. Это действительно правильный ответ. Обратите внимание, что точность и масштаб должны быть целыми числами, а не строками.

4. @jurrieb, спасибо за уточнения о целых числах. Я обновил ответ.

Ответ №2:

После дальнейшего изучения и некоторой помощи от Cake Development Corp. Оказывается, правильный способ указать точность и масштаб — использовать «limit», а не «length», как я пытался. Так что это должно быть так:

 'license_fee' => array(
   'type' => 'number',
   'null' => true,
   'limit' => '15,6', //this is where I was wrong by using length
   'default' => 0
),
  

Это будет работать также при использовании ‘type’ => ‘decimal’, который на самом деле является тем же типом данных. Конечный результат соответствует ожиданиям:

 license_fee               | numeric(15,6) | default 0
  

Я надеюсь, что это полезно для кого-то.

Ответ №3:

Для версии 3.10:

 $table->addColumn('name', ['type' => 'decimal', 'length' => 10, 'precision' => 3])
  

В /vendor/cakephp/cakephp/src/Database/Schema/TableSchema.php являются ли допустимые ключи, которые можно использовать в столбце:

 $_columnKeys = [
    'type' => null,
    'baseType' => null,
    'length' => null,
    'precision' => null,
    'null' => null,
    'default' => null,
    'comment' => null,
];