Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移

Posted

技术标签:

【中文标题】Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移【英文标题】:Symfony 5 (Doctrine 2.9), Doctrine does not generate migration for a ManyToOne self-referencing relation 【发布时间】:2021-09-24 05:58:59 【问题描述】:

我在一个项目中使用 Symfony 5Doctrine 2.9,我需要在同一个表上建立多对一关系(自引用)。

为此,我使用了以下链接https://www.doctrine-project.org/projects/doctrine-orm/en/2.9/reference/association-mapping.html

对于一对多、自引用关系,它表示:

<?php
/** @Entity */
class Category

    // ...
    /**
     * One Category has Many Categories.
     * @OneToMany(targetEntity="Category", mappedBy="parent")
     */
    private $children;

    /**
     * Many Categories have One Category.
     * @ManyToOne(targetEntity="Category", inversedBy="children")
     * @JoinColumn(name="parent_id", referencedColumnName="id")
     */
    private $parent;
    // ...

    public function __construct() 
        $this->children = new \Doctrine\Common\Collections\ArrayCollection();
    

感谢我可以使用php bin/console make:entity 更新我的实体并添加所需的关系。

问题是,当我的实体使用新关系更新时,我创建了一个php bin/console make:migration 以生成所需的迁移,但没有检测到任何更改。

这并不重要,因为我可以手动生成迁移,但是当我手动更新表时,通过添加外键和关联索引,在下一次迁移时,学说建议我删除外键,索引和属性(parent_id)。

有解决这个问题的办法吗?

感谢您的宝贵时间,

纪尧姆

【问题讨论】:

在使用迁移时,您不应该尝试手动更新架构,因为学说会尝试在下次迁移时覆盖它。尝试更新您的 $parent,仅使用:* @ORM\ManyToOne(targetEntity=Category::class, inversedBy="children") 感谢您的回答,将这个:/** * @ORM\OneToMany(targetEntity="Category", mappedBy="parent") */ private $children; /** * @ORM\ManyToOne(targetEntity="Category", inversedBy="children") */ private $parent; 放在我的关联实体中,我仍然没有生成迁移。我不知道当我们尝试生成具有自引用关系的迁移时,symfony 迁移制造商是否有困难。谢谢。 我想知道,我有类似的自引用关联,我没有问题,你的学说版本和制造商捆绑包是什么? 你有一些关于 Doctrine 的缓存吗?你能把你的配置文件添加到你的问题中吗(cache.yaml、教义.yaml、教义_migrations.yaml ...) 感谢您的回答,就像@qdequippe 说的那样,我清除了 Doctrine 的缓存并且它起作用了。以前我只做过php bin/console cache:clear。谢谢你的时间。我可以在下面添加答案还是您要添加它(如果您愿意,我会为您投票以寻求帮助?) 【参考方案1】:

你必须用这个命令清理你的 Doctrine 缓存(取决于你的配置):

$ bin/console doctrine:cache:clear-metadata

【讨论】:

以上是关于Symfony 5(Doctrine 2.9),Doctrine 不会为 ManyToOne 自引用关系生成迁移的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5,Doctrine queryBuilder OneToMany 关系

Symfony 5 和 Doctrine,找不到使用 3 个相关实体获取结果的方法

“名称解析中的临时失败”:Symfony 5.3 使用 Doctrine 和 Docker 连接到 MariaDB

Symfony 3.4没有元数据类来处理错误

Symfony 5 中的 Doctrine Gedmo-Extension (Timestampable, Softdeletable ...) 有替代品吗?

Symfony 2 + Doctrine 2 + PHPUnit 3.5:闭包异常的序列化