学说:从 XXX 到 YYY 的关系引用的列名“id”不存在

Doctrine: Column name `id` referenced for relation from XXX towards YYY does not exist

我正在创建 Symfony 3.4 e-commerce 网站。我已将 FOSUserBundle User 实体扩展到 link 到已被最终用户标记为 'Favorite' 的项目列表:

/**
 * @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;

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

Column name id referenced for relation from AppBundle\Entity\User towards AppBundle\Entity\AbstractProduct does not exist.

查看 Doctrine annotation documentation,任何列为 JoinColumnnullable 默认值为 true,所以我有点不知所措为什么系统抱怨 non-existent User id。

看过Symfony documentation regarding correctly mapping to abstract classes,但是我的AbstractProductclass有两个children - ProductFabricProduct。我不确定如何映射那些使用文档中的技术,如果它确实是我应该去的方式。

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

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

/**
 * @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 class 来实现 FoobarInterface 提供的部分或全部方法,但这与 Doctrine 无关。

顺便说一下,您通常不需要 @ORM\JoinTable 注释。我不知道人们总是从哪里得到它,但通常不需要它,而且在很多情况下只会造成麻烦。 Doctrine 将隐式处理映射。如果您明确想要与 Doctrine 默认情况下不同的东西,则只需要该注释。