0

我正在创建一个 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 注释文档,任何列为 a 的内容JoinColumnnullable默认为,所以我对系统为什么抱怨不存在的id true有点茫然。User

我查看了有关正确映射到抽象类的Symfony文档,但我的AbstractProduct班级有两个孩子 -ProductFabricProduct. 我不确定如何使用文档中的技术映射那些,如果这确实是我应该走的路。

4

1 回答 1

3

您不能映射到抽象类,因为 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 不同的东西,则只需要该注释。

于 2018-02-14T08:31:24.910 回答