Принудительная доктрина для создания type=»guid» как VARCHAR(255) вместо CHAR(36)

#mysql #symfony #doctrine-orm #doctrine

#mysql #symfony #doctrine-orm #доктрина

Вопрос:

Я пытаюсь добавить новую сущность в мой проект Symfony, который использует GUID поле для сопоставления с другой сущностью:

 // OtherEntity

/**
 * @ORMId
 * @ORMColumn(name="guid", type="guid", unique=true)
 */
protected $guid;


// New Entity

/**
 * @ORMManyToOne(targetEntity="OtherEntity")
 * @ORMJoinColumn(name="other_guid", referencedColumnName="guid", nullable=false, onDelete="SET NULL")
 */
protected $otherEntity;
  

Doctrine сбрасывает следующие SQL-файлы для создания таблицы для NewEntity при использовании php app/console doctrine:schema:update --dump-sql :

 CREATE TABLE new_entity (guid CHAR(36) NOT NULL COMMENT '(DC2Type:guid)', other_guid CHAR(36) NOT NULL COMMENT '(DC2Type:guid)', ...

ALTER TABLE new_entity ADD CONSTRAINT FK_D3D1CD16A7FC4818 FOREIGN KEY (other_guid) REFERENCES other_entity (guid) ON DELETE SET NULL;
  

При запуске doctrine:schema:update --force вместо этого я получаю следующую ошибку:

 [DoctrineDBALExceptionDriverException]                                                                                                                                     
An exception occurred while executing 'ALTER TABLE new_entity ADD CONSTRAINT FK_D3D1CD16A7FC4818 FOREIGN KEY (other_guid) REFERENCES other_entity (guid) ON DELETE SET NULL':  
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint 
  

После некоторого копания я обнаружил, что проблема заключается в type="guid" переводе на CHAR(36) . Если вместо этого используется VARCHAR(255) , все работает нормально.

Проблема в том, что guid поле other_entity таблицы является VARCHAR(255) . Таким образом, CHAR(36) поле в new_entity не может быть сопоставлено с полем другого типа.

Я недавно обновил свой проект Symfony:

 doctrine/dbal               v2.4.4  --> 2.5.5
doctrine/doctrine-bundle    v1.2.0  --> 1.6.2           
doctrine/orm                v2.4.8  --> 2.5.5
symfony/symfony             v2.7.7  --> v2.8.12
  

При запуске doctrine:schema:update в старой конфигурации GUID поля создаются как VARCHAR(255) , в то время как новая конфигурация создает их как CHAR(36) .

Использование CHAR(36) имеет смысл, поскольку это длина идентификаторов GUID. Но новый формат вызывает проблему, описанную ранее: сопоставления со старыми полями того же типа (guid) больше невозможны.

Я не понимаю, почему doctrine:schema:update также не обновляет существующие поля до нового формата.

Могу ли я что-нибудь сделать, либо заставить Doctrine обновить все существующие поля до CHAR(36) или продолжать создавать GUID как VARCHAR(255) ?

Ответ №1:

Попробуйте указать одинаковую длину для связанных полей и добавить options={"fixed" = true}