Как правильно удалить элемент в однонаправленном отношении ManyToOne с Doctrine? - PullRequest
0 голосов
/ 09 апреля 2020

Вопрос: Как правильно удалить элемент в отношении 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 в моем классе FooBar), чтобы вызвать каскад удаления: @ORM\Mapping\ManyToOne(targetEntity="App\Entity\Image",cascade={"remove"},fetch="EAGER"); но в этом случае возникает исключение, если ссылка все еще существует на образе.

И так как флаг orphanRemoval не существует в отношении ManyToOne, я застрял, чтобы определить правильную конфигурацию / решение.

Любая помощь приветствуется ...

...