#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,
];