我有一个用户实体和一对一关系的头像实体:
//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)......
有没有人有想法?
答案 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")
*/