我在Doctrine中设置了一个简单的User-> Comment关联,简单的OneToMany(一个用户可以写很多评论)。
所有的作品都找到了,但我发现了一种奇怪的教义行为。首先是一些代码:
用户实体
/**
* @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;
}
在User中,doctrine需要 mappedBy 属性,因为它是关联的反向侧。但是看起来,我可以写出我想要的任何东西作为价值。 (我认为正确的值是“user_id”?)
那么,这个值何时被使用或检查过?
答案 0 :(得分:0)
是的,你是对的,在我的项目中检查过它 - 没有发出错误。它会影响实体的加载方式(在fetch="EAGER"
内设置OneToMany
并且你会收到错误),主要是在对数据进行水合时将所有者方设置在注释对象上(这会更加神奇在引擎盖下很难理解)。我在doctrine bug tracker中发布了一个问题,如果你拼错了一个字段名,它就是一个难以调试的错误来源。
<小时/> 您还需要指定
inversedBy
:
/**
* @var User
* @ORM\ManyToOne(targetEntity="User", inversedBy="_commentsAuthored")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*
*/
protected $_author;
当您检索 _commentsAuthored
的值并尝试对其执行某些操作(例如,计算它)时,应该使用它