学说:从 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,任何列为 JoinColumn
的 nullable
默认值为 true
,所以我有点不知所措为什么系统抱怨 non-existent User
id。
我有看过Symfony documentation regarding correctly mapping to abstract classes,但是我的AbstractProduct
class有两个children - Product
和 FabricProduct
。我不确定如何映射那些使用文档中的技术,如果它确实是我应该去的方式。
您不能映射到抽象 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 默认情况下不同的东西,则只需要该注释。
我正在创建 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,任何列为 JoinColumn
的 nullable
默认值为 true
,所以我有点不知所措为什么系统抱怨 non-existent User
id。
我有看过Symfony documentation regarding correctly mapping to abstract classes,但是我的AbstractProduct
class有两个children - Product
和 FabricProduct
。我不确定如何映射那些使用文档中的技术,如果它确实是我应该去的方式。
您不能映射到抽象 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 默认情况下不同的东西,则只需要该注释。