教义:在 OneToMany 关联中忽略了 mappedBy 的值
Posted
技术标签:
【中文标题】教义:在 OneToMany 关联中忽略了 mappedBy 的值【英文标题】:Doctrine: Value of mappedBy ignored in OneToMany Association 【发布时间】:2012-05-13 17:29:52 【问题描述】:我在Doctrine中建立了一个简单的User->Comment关联,简单的OneToMany(一个User可以写很多Comments)。
所有作品都找到了,但我发现了 Doctrine 的一个奇怪行为。首先是一些代码:
用户实体
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User extends EntityAbstract
/**
* @var int
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue
*/
protected $_id;
/**
* @var \Doctrine\Common\Collections\Collection
* @ORM\OneToMany(targetEntity="Comment", mappedBy="TodayIsASunnyDay")
* ^^^^^^^^^^^^^^^^ WTF
*/
protected $_commentsAuthored;
public function __construct()
$this->_commentsAuthored =
new \Doctrine\Common\Collections\ArrayCollection();
评论实体
/**
* @ORM\Entity
* @ORM\Table(name="comments")
*/
class Comment extends EntityAbstract
/**
* @var int
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue
*/
protected $_id;
/**
* @var User
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*
*/
protected $_author;
在用户中,学说需要一个 mappedBy 属性,因为它是关联的反面。但看起来,我可以写任何我想要的价值。 (我认为正确的值是“user_id”?)
那么,什么时候使用或检查过这个值?
【问题讨论】:
【参考方案1】:是的,你是对的,在我的项目中检查了它 - 没有发出错误。它会影响实体的加载方式(在OneToMany
中设置fetch="EAGER"
,你会得到错误),主要是它在水合数据时将所有者设置在评论对象上(引擎盖下还有更多的魔力很难理解)。我会在教义错误跟踪器中发布一个问题,如果您拼错了字段名称,这是一个难以调试的错误来源。
您还需要指定
inversedBy
:
/**
* @var User
* @ORM\ManyToOne(targetEntity="User", inversedBy="_commentsAuthored")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*
*/
protected $_author;
当你确实检索到_commentsAuthored
的值并尝试用它做一些事情(例如,计算它)时应该使用它
【讨论】:
inversedBy 的值也被忽略/不评估。从数据库中获取用户并调用 $user->cmetsAuthored->count() 可以正常工作。与 $comment->author 相同,它返回正确的用户对象... @MatthiasBayer 是否使用了您的注释?我的意思是您没有将 XML/Yaml 映射转换为注释吗? 注解工作正确并且是手动编写的。不能从其他格式转换。生成的 SQL 是正确的。正如我所说,我不知道这些值在哪里使用过.. @MatthiasBayer 是的,你是对的,在我的项目中检查了它 - 没有发出错误。它会影响实体的加载方式(设置 fetch="EAGER" 并且您会收到错误),主要是在水合数据时将所有者设置在评论对象上。我会在教义错误跟踪器中发布一个问题,如果您拼错了字段名称,这是一个难以调试的错误来源。 我无法重现这一点(通过在 OneToMany/ManyToOne 注释中添加 fetch="EAGER")。您能否提供一些 coud 或 bugtracker 的链接?以上是关于教义:在 OneToMany 关联中忽略了 mappedBy 的值的主要内容,如果未能解决你的问题,请参考以下文章