Doctrine:从XXX到YYY的关系引用的列名`id`不存在

时间:2018-02-14 01:28:16

标签: php doctrine-orm annotations symfony-3.4

我正在创建一个Symfony 3.4电子商务网站。我已将FOSUserBundle User实体扩展为链接到已标记为“收藏夹”的项目列表。最终用户:

/**
 * @ORM\ManyToMany(targetEntity="AbstractProduct")
 * @ORM\JoinTable(name="users_favorites",
 *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *     inverseJoinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")}
 *     )
 */
private $favorites;

当我尝试通过控制台对数据库执行任何操作时,出现以下错误:

  

从AppBundle \ Entity \ User到AppBundle \ Entity \ AbstractProduct的关系引用的列名id不存在。

查看Doctrine annotation documentation,列为JoinColumn的内容nullable的默认设置为true,所以我稍微考虑一下关于系统为什么抱怨不存在User id的问题。

查看了Symfony documentation regarding correctly mapping to abstract classes,但我的AbstractProduct班级有两个孩子 - ProductFabricProduct 。我不确定如何使用文档中的技术来映射,如果它确实是我应该去的方式。

1 个答案:

答案 0 :(得分:2)

您无法映射到抽象类,因为在创建模型时,Doctrine无法解析它们。但是,有一个特殊功能,您可以声明接口并配置接口到实体类的映射。

在您的实体类中,将接口定义为目标实体。请注意,您必须使用接口的完整类名:

/**
 * @ORM\ManyToMany(targetEntity="Foo\BarBundle\Entity\FoobarInterface")
 */
private $foobar;

app/config/config.yml添加以下部分:

doctrine :
    orm :
        resolve_target_entities :
            Foo\BarBundle\Entity\FoobarInterface : Foo\BarBundle\Entity\Foobar

当然,您可以自由地提供AbstractFoobar类来实现FoobarInterface提供的部分或全部方法,但这与Doctrine无关。

顺便说一句,您通常不需要@ORM\JoinTable注释。我不知道人们从哪里得到它,但通常不需要它,并且在许多情况下只引起麻烦。 Doctrine将隐式处理映射。如果您明确要求与默认情况下Doctrine所做的不同,那么您只需要该注释。