代码之家  ›  专栏  ›  技术社区  ›  Overdose

Symfony:如何将不可为null的字段添加到具有条目的实体中

  •  2
  • Overdose  · 技术社区  · 7 年前

    我有一个实体主题,前面设置了属性(id、名称),并且 主题表现在已填充 。 由于项目不断发展,我需要一个新的属性目录。但问题是这个属性必须是非null的。

    class Topic
    {
      /**
       * @var integer
       *
       * @ORM\Column(name="id", type="integer")
       * @ORM\Id
       * @ORM\GeneratedValue(strategy="IDENTITY")
       */
      private $id;
    
      /**
       * @var \MyBundle\Entity\Catalog
       * @ORM\ManyToOne(targetEntity="MyBundle\Entity\Catalog")
       * @ORM\JoinColumns({
       *   @ORM\JoinColumn(name="catalogId", referencedColumnName="id", nullable=false)
       * })
       * @Assert\NotBlank()
       */
      private $catalog;
    
      /**
       * @var string
       *
       * @ORM\Column(name="name", type="string", length=255, nullable=false)
       * @Assert\NotBlank()
       */
      private $name;
    }
    

    这个 doctrine:schema:update --dump-sql 是否正常:

    ALTER TABLE topic ADD catalogId INT NOT NULL;
    ALTER TABLE topic ADD CONSTRAINT FK_9D40DE1B19B71A2D FOREIGN KEY (catalogId) REFERENCES catalog (id);
    CREATE INDEX IDX_9D40DE1B19B71A2D ON topic (catalogId);
    

    问题是如果我 doctrine:schema:update --force 我有一个错误,说我不能。

    SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`simspeaker`.`#sql-3d2  
      _71`, CONSTRAINT `FK_9D40DE1B19B71A2D` FOREIGN KEY (`catalogId`) REFERENCES `catalog` (`id`))
    

    我设法绕过这个错误的唯一方法是不要一步到位:

    1. 我将catalog字段设置为nullable
    2. 我将默认目录值设置为整个表
    3. 我将catalog字段设置为不可为null

    这充其量也不是最优的。有没有办法在“一次通过”中执行这种修改?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Marc Runkel    3 年前

    这里似乎没有答案,这是谷歌上的第一个结果,所以我只写一个简短的结果。

    在迁移过程中:

    • 首先将新字段添加为null
    • 使用适当的数据更新新字段
    • 将新字段更改为不可为null

    瞧。

    我将在中间步骤中添加一条警告,即编写SQL查询,不要使用原则,因为这将在将来引起麻烦。实体的更改方式可能与您的代码不兼容。然后你的迁移就会中断,你会很难过。我不想让你难过。

        2
  •  -1
  •   David Kmenta    7 年前

    当然,您可以使用 Doctrine Migrations

    问题是合乎逻辑的,如果键(在您的情况下,键为0)不存在,则无法创建外键。