教义:在 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 的值的主要内容,如果未能解决你的问题,请参考以下文章

教义 2 OneToMany 级联设置 NULL

教义删除必须进行两次

与一个实体的多个 OneToMany 关系

将带有引用的关联数组作为值保存在教义-mongodb中

添加到 ArrayCollection 时,教义未链接到拥有对象

Doctrine 不会在我的 OneToMany 关联中保存数据