Поле Doctrine jsonb добавляет значение по умолчанию как $${}$$Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Поле Doctrine jsonb добавляет значение по умолчанию как $${}$$

Сообщение Anonymous »

Я хочу иметь объект с XML-сопоставлением, который при запуске Doctory:migrations:diff приведет к миграции, которая будет генерировать схему, подобную схеме

Код: Выделить всё

CREATE TABLE brand (
"product_id"                    varchar                     NOT NULL,
"id"                            varchar,
"settings"                      jsonb                       NOT NULL DEFAULT $${}$$
);
ALTER TABLE brand ADD CONSTRAINT products_brands_pkey
PRIMARY KEY ("product_id");
ALTER TABLE brand ADD CONSTRAINT products_brands_product_id_fkey
FOREIGN KEY ("product_id") REFERENCES products ("id");
поэтому я добавил вот такое сопоставление XML

Код: Выделить всё













$${}$$
true 







и сгенерированная миграция выглядит так

Код: Выделить всё

 $this->addSql('CREATE TABLE brands (product_id VARCHAR(255) NOT NULL, id VARCHAR(255) DEFAULT NULL, settings JSONB DEFAULT \'$${}$$\' NOT NULL, PRIMARY KEY(product_id))');
$this->addSql('ALTER TABLE brands ADD CONSTRAINT FK_6B0C4BCD4584665A FOREIGN KEY (product_id) REFERENCES products (id)');
Пока все хорошо, но при выполнении миграции возникла ошибка

Код: Выделить всё

  SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for type json
LINE 1: ...VARCHAR(255) DEFAULT NULL, settings JSONB DEFAULT '$${}$$' N...
^
DETAIL:  Token "$" is invalid.
CONTEXT:  JSON data, line 1: $...

Это можно исправить, отредактировав созданную миграцию вручную и удалив \' из \'$${}$$\'.
Но в этом случае, если я запущу доктрину:migrations:diff еще раз, она сгенерирует новую миграцию с кодом типа

Код: Выделить всё

 $this->addSql('ALTER TABLE brands SET DEFAULT \'$${}$$\'');
поэтому он хочет добавить \', поэтому в конце это снова приведет к неудачной миграции.
Я также попробовал другой подход , изменив

Код: Выделить всё

   

$${}$$
true 




в моем XML в В этом случае сгенерированная миграция верна (без \'):

Код: Выделить всё

 $this->addSql('CREATE TABLE brands (product_id VARCHAR(255) NOT NULL, id VARCHAR(255) DEFAULT NULL, settings JSONB DEFAULT $${}$$ NOT NULL, PRIMARY KEY(product_id))');
$this->addSql('ALTER TABLE brands ADD CONSTRAINT FK_6B0C4BCD4584665A FOREIGN KEY (product_id) REFERENCES products (id)');
но все же, если я запущу Doctory:migrations:diff еще раз после миграции, она сгенерирует еще одну миграцию, которая по какой-то причине попытается удалить значение по умолчанию, генерируя такой код

Код: Выделить всё

$this->addSql('ALTER TABLE brands ALTER settings DROP DEFAULT');
Поэтому я не знаю, как добавить значение по умолчанию для JSONB, например $${}$$

Подробнее здесь: https://stackoverflow.com/questions/790 ... t-value-as
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»