教义模式更新总是尝试添加 NOT NULL

Posted

技术标签:

【中文标题】教义模式更新总是尝试添加 NOT NULL【英文标题】:Doctrine schema update always try to add NOT NULL 【发布时间】:2017-07-21 02:04:14 【问题描述】:

我有一个全新的 Symfony 2.8 安装,带有教义和 mysql 5.6 堆栈。

执行doctrine:schema:update --force后,我可以看到Database schema updated successfully! "x" queries were executed

这是我的问题:即使我多次执行,学说总是会发现架构差异。

使用--dump-sql,我可以看到所有这些查询都与:

字符串 主键上添加 NOT NULL 在日期时间添加 NOT NULL 字段

但是,当我检查我的数据库时,这些列已经有一个 NOT NULL。

这是一个关于单个属性/列的示例:

class MyEntity

    /**
     * @ORM\Id
     * @ORM\Column(type="string", length=5, name="cd_key")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
     private $code;
     ...  

这是SHOW CREATE TABLE my_entity; 的结果:

CREATE TABLE `my_entity` (
  `cd_key` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
  `label` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `number` int(11) NOT NULL,
  PRIMARY KEY (`cd_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

这里的查询原则尝试使用doctrine:schema:update 命令执行:

ALTER TABLE my_entity CHANGE cd_key cd_key VARCHAR(5) NOT NULL;
我在每次命令执行之间清理我的 Symfony 缓存。 我尝试在@Column 注释上添加nullable=false(如果它已被定义为@Id,则为事件),但没有效果。 doctrine:schema:validate 没有发现任何映射问题(当然同步除外) 我尝试删除并重新创建完整的数据库,但没有效果。

有什么想法吗?

【问题讨论】:

不会设置nullable=false 意味着它将NOT NULL 添加为该列的一部分?将其更改为 nullable=true 将允许该值为 null。 【参考方案1】:

这个问题至少在 2017 年被报告过 here、here 和 here 并且应该由这个 PR 修复。

更新 doctrine/dbal 将是解决方案 (not working for me though):

$ composer require doctrine/dbal:^2.7.1

从配置中取消设置服务器版本(mysql/mariadb)也可以解决问题(但仍然不适合我)。

如果有人使用迁移,他仍然可以手动调整它们(但他的架构将始终不同步)。

【讨论】:

【参考方案2】:

我遇到过类似的问题。对我来说,使用 SQL 删除表然后再次运行 DOCTRINE:SCHEMA:UPDATE --FORCE 为我工作。

似乎手动执行一些 SQL 请求会使 Doctrine 感到困惑。

这么说,我假设您已将 @ORM\Table(name="my_entity")@ORM\Entity(repositoryClass="myrepository") 放在您的类定义上;)。

希望它有所帮助。

【讨论】:

我尝试删除表(甚至是完整的数据库),但是在新的 'doctrine:schema:update' 之后,我遇到了同样的问题。无论如何感谢您的帮助:)

以上是关于教义模式更新总是尝试添加 NOT NULL的主要内容,如果未能解决你的问题,请参考以下文章

使用教义插入查询

在 postPersist 事件中插入教义

教义事件,更新持久化实体

当 Symfony 教义对象的一个​​属性发生变化时更新另一个属性

更新元素的 Doctrine2 缓存

将带有教义查询的虚拟字段添加到 symfony 实体