【问题标题】:Avoid lazy loading Doctrine Symfony2避免延迟加载 Doctrine Symfony2
【发布时间】:2015-08-01 16:41:09
【问题描述】:

我的项目中有两个实体:用户和头像。

用户拥有具有 OneToOne 关系的 Avatar。

Avatar 是一个具有文件对象和文件名的实体。它使用@ORM\HasLifecycleCallbacks 来保存或删除文件,如Symfony2 documentation 中所述。

在我的控制器中,我想从当前用户中删除 Avatar 实体(我使用 $user = $this->get('security.context')->getToken()->getUser()),但我无法使用 $user->getAvatar() 访问头像:

var_dump($user->getAvatar());

object(AppBundle\Entity\Avatar)
    private 'id' => int 20
    public 'file' => null
    private 'fileName' => null

但如果我尝试访问头像的文件名,它会被返回:

$filename = $user->getAvatar()->getFileName();
var_dump($user->getAvatar());

object(AppBundle\Entity\Avatar)
    private 'id' => int 20
    public 'file' => null
    private 'fileName' => string 'myfile.png'

如何获取与我的用户关联的头像?

【问题讨论】:

    标签: php symfony doctrine-orm doctrine lazy-loading


    【解决方案1】:

    Doctrine docs 中所述,您只需指定要急切的获取行为。

    /**
     * @OneToOne(targetEntity="User", fetch="EAGER")
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    

    请参阅 YAML 文档或其他配置示例。

    【讨论】:

    • 谢谢你,我已经找了好几个小时了! (是“EAGER”,“eager”抛出异常)
    • 在查询期间更改获取模式仅适用于一对一和多对一关系。
    • 参考:我必须将 fetch 参数放在 @OneToOne 注释中才能在 Symfony 2.8 Doctrine/ORM 2.5 下工作
    • @Anonymous:请注意 suggested edit 关于 fetch 属性的位置。我不知道,但它似乎与文档一致。作为帖子的作者,我认为如果您认为编辑是正确的,您仍然可以接受。
    • @NisseEngström:谢谢。我不确定为什么我的编辑被其他两位审阅者拒绝了,没有它,这个答案完全是错误的,但非常接近正确。再次建议编辑会是不好的形式吗?请参阅:github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/…github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/… 以了解有效的注释定义及其有效属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多