我正在创建一个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
班级有两个孩子 - Product
和FabricProduct
。我不确定如何使用文档中的技术来映射,如果它确实是我应该去的方式。
答案 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所做的不同,那么您只需要该注释。