我是新手在Symfony教义和需要一些帮助加入实体。
通常列是通过主键ID连接的
/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="MainBundle\Repository\UserRepository")
* UniqueEntity("email", message="Account with email already exists.")
*/
class User implements AdvancedUserInterface, \Serializable
{
/**
* @var \MainBundle\Entity\PersonDetails
*
* @ORM\ManyToOne(targetEntity="MainBundle\Entity\Person")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="person_details_id", referencedColumnName="id", nullable=true)
* })
*/
private $personDetails = null;
这是好的。
但问题是,我想通过用户实体中的id字段连接一对一关系中的两列
/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="MainBundle\Repository\UserRepository")
* UniqueEntity("email", message="Account with email already exists.")
*/
class User implements AdvancedUserInterface, \Serializable
{
/**
* @var \MainBundle\Entity\PersonDetails
*
* @ORM\ManyToOne(targetEntity="MainBundle\Entity\Person")
* @ORM\JoinColumn(name="id", referencedColumnName="user_id", nullable=true)
* })
*/
private $personDetails = null;
当我尝试以这种方式连接列时,我得到错误
MainBundle\Entity\PersonDetails上的主键ID缺少值
是否有可能索引其他领域比id或我试图做的是不可能的?
谢谢你们
2条答案
按热度按时间hmmo2u0o1#
你把应该在
@JoinColumn
声明中引用的列名和字段名弄混了。这样,Doctrine会在
User
实体上查找名为user_id
的字段/属性。我猜您希望连接表中的列命名为user_id
,条目是User
实体的id
。用户详细信息
用户
现在,如果你像这样添加一个细节到你的
User
中,然后持久化/刷新:这将导致
user_detail
表中的join-columm如下所示:6jygbczu2#
引用Doctrine文档:
不可能使用指向非主键的连接列。Doctrine会认为这些是主键,并使用数据创建延迟加载代理,这可能导致意外的结果。出于性能原因,Doctrine可以在运行时不验证此设置的正确性,而只能通过XMLSchema命令验证。
我遇到了同样的问题,我通过只Map到主键字段来解决它。如果我需要通过其他字段获取相关实体,我在实体存储库中实现方法。