У меня есть сущность «Пользователь» и сущность «Аватар» с отношением «один к одному»:
//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())
Я получаю пустое имя файла, даже если имя файла существует в базе данных:
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, как видно ранее) …
У кого-нибудь есть идея?
Попробуй это:
if($currentUser->getAvatar()){
$currentUser->removeUpload();
}
Спасибо за ваши ответы!
На самом деле это из-за «ленивой нагрузки» доктрины:
Если я сделаю :
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'
Это довольно раздражает … Я создам новый пост, чтобы исправить это.
РЕДАКТИРОВАТЬ : Новый пост Вот, и это решено:
Чтобы избежать ленивой загрузки из доктрины, просто добавьте fetch="EAGER"
в вашей родительской организации:
/**
* @OneToOne(targetEntity="User")
* @JoinColumn(name="user_id", referencedColumnName="id", fetch="EAGER")
*/