无法让用户的头像实体在Symfony2中将其删除

时间:2015-08-01 14:26:25

标签: php symfony doctrine entity one-to-one

我有一个用户实体和一对一关系的头像实体:

//MyBundle/Entity/User.php

/**
 * @ORM\OneToOne(targetEntity="Participso\UserBundle\Entity\Avatar", cascade={"remove", "persist"})
 */
protected $avatar;

如果用户已经拥有头像,我想使用以下内容删除前一个:

//MyBundle/Controller/UserController.php

if ($avatarForm->isValid()) {
    $em = $this->getDoctrine()->getManager();

    if($currentUser->getAvatar()){
        $em->remove($currentUser->getAvatar());
    }

    $currentUser->setAvatar($avatar);
    $em->persist($currentUser); //"cascade=persist" from User
    $em->flush();
}

而且:

//MyBundle/Entity/Avatar.php

/**
 * @ORM\PostRemove()
 */
public function removeUpload()
{
    $file = __DIR__.'/../../../../web/uploads/avatar/' . $this->fileName;
    unlink($file);
}

但是当我做var_dump($currentUser->getAvatar())时 我得到一个空的FileName,即使数据库中存在文件名:

object(Proxies\__CG__\Participso\UserBundle\Entity\Avatar)[355]
    public '__initializer__' => 
object(Closure)[348]
    public '__cloner__' => 
object(Closure)[349]
    public '__isInitialized__' => boolean false
    private 'id' (Participso\UserBundle\Entity\Avatar) => int 20
    public 'file' => null
    private 'fileName' (Participso\UserBundle\Entity\Avatar) => null

当我var_dump($currentUser->getAvatar()->getFileName)时,我得到了文件名!! (而不是之前看到的NULL)......

有没有人有想法?

2 个答案:

答案 0 :(得分:1)

试试这个:

if($currentUser->getAvatar()){
       $currentUser->removeUpload();
}

答案 1 :(得分:0)

感谢您的回复!

事实上,这是因为学说的“懒惰载入”:

如果我这样做:

var_dump($currentUser->getAvatar());exit;

输出:

object(Proxies\__CG__\Participso\UserBundle\Entity\Avatar)[355]
    private 'id' (Participso\UserBundle\Entity\Avatar) => int 20
    private 'fileName' (Participso\UserBundle\Entity\Avatar) => null

但如果我这样做

$whatever = $currentUser->getAvatar()->getFileName();
var_dump($currentUser->getAvatar());exit;

输出:

object(Proxies\__CG__\Participso\UserBundle\Entity\Avatar)[355]
    private 'id' (Participso\UserBundle\Entity\Avatar) => int 20
    private 'fileName' (Participso\UserBundle\Entity\Avatar) => string 'd4e5eadd3757498a22b14ad1f81869c2baf459d3.png'

这很烦人......我会创建一个新帖来解决这个问题。

编辑:新帖子为here,已解决:

要避免从学说中延迟加载,只需在您的父实体中添加fetch="EAGER"

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