Вопрос: Как правильно удалить элемент в отношении ManyToOne
Контекст: Php 7.3 / Symfony 4 / Doctrine 2.7 / Api-платформа 2.5
Описание:
У меня есть следующие объекты:
Определение класса Image
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Annotation\ApiProperty;
use Doctrine\ORM\Mapping as ORM;
/**
* Class Image
* @package App\Entity
*
* @ApiResource(...)
* @ORM\Entity
*/
class Image extends Media
{
/**
* @ApiProperty()
* @ORM\Column(type="guid")
* @ORM\Id
* @var null|string
*/
protected $id;
/* ... properties */
/* ... getters/setters */
}
Определение класса Foo
:
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Annotation\ApiProperty;
use Doctrine\ORM\Mapping as ORM;
/**
* Class Foo
* @package App\Entity
*
* @ApiResource(...)
* @ORM\Entity
*/
class Foo
{
/**
* @ApiProperty()
* @ORM\Column(type="guid")
* @ORM\Id
* @var null|string
*/
protected $id;
/**
* @var array|null
* @ApiProperty()
* @ORM\Mapping\ManyToOne(targetEntity="App\Entity\Image",cascade={"remove"},fetch="EAGER")
*/
private $image;
public function getImage()
{
return $this->image;
}
public function setImage($image): void
{
$this->image = $image;
}
/* ... other properties */
/* ... getters/setters */
}
Определение класса Bar
:
class Bar
{
/* ... property id */
/**
* @var array|null
* @ApiProperty()
* @ORM\Mapping\ManyToOne(targetEntity="App\Entity\Image",cascade={"remove"},fetch="EAGER")
*/
private $image;
public function getImage()
{
return $this->image;
}
public function setImage($image): void
{
$this->image = $image;
}
/* ... other properties */
/* ... getters/setters */
}
В моей текущей архитектуре:
- ссылка на два объекта один и тот же объект
Image
через однонаправленное отношение ManyToOne
, - на одно изображение может ссылаться несколькими ресурсами
- Два экземпляра
Foo
могут иметь отношение к одному и тому же Image
экземпляр - Один
Foo
экземпляр и один Bar
экземпляр могут иметь отношение к одному и тому же Image
экземпляру
Вопрос / Issue:
В моем контроллере, когда я удаляю ресурс (Foo
или Bar
), я хочу автоматически удалить изображение (в моей базе данных), если нет ссылок Мы оставлены для этого изображения. как справиться с таким поведением?
Я пытаюсь изменить аннотацию doctrine в моем классе Foo
(и Bar
), чтобы вызвать каскад удаления: @ORM\Mapping\ManyToOne(targetEntity="App\Entity\Image",cascade={"remove"},fetch="EAGER")
; но в этом случае возникает исключение, если ссылка все еще существует на образе.
И так как флаг orphanRemoval
не существует в отношении ManyToOne
, я застрял, чтобы определить правильную конфигурацию / решение.
Любая помощь приветствуется ...