#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}