Как автоматически сохранять изображения от родительской сущности к дочерней в сонате admin - PullRequest
0 голосов
/ 07 мая 2019

Я застрял и не могу понять, как решить эту проблему.Я использую symfony 3.4 и sonata admin .У меня есть два класса сущностей с именами Certificate и CertificateImage со следующими отношениями:

    class Certificate 
{
        /**
     * @var Certificate
     *
     * @ORM\OneToOne(targetEntity="CMS3\CoreBundle\Entity\Certificate", inversedBy="child")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="parent_id", referencedColumnName="id", unique=true)
     * })
     */
    private $parent;


        /**
     * @var Certificate
     *
     * @ORM\OneToOne(targetEntity="CMS3\CoreBundle\Entity\Certificate", mappedBy="parent", orphanRemoval=true)
     */
    private $child;

        /**
     * @var CertificateImage[]|Collection
     *
     * @ORM\OneToMany(targetEntity="CMS3\CoreBundle\Entity\CertificateImage", mappedBy="certificate", cascade={"persist", "remove"})
     */
    private $images;

    // getters and setters 
}

class CertificateImage 
{
     /**
     * @var Media
     *
     * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"})
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="image_id", referencedColumnName="id")
     * })
     */
    private $image;

        /**
     * @var Certificate
     *
     * @ORM\ManyToOne(targetEntity="CMS3\CoreBundle\Entity\Certificate", inversedBy="images")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="certificate_id", referencedColumnName="id")
     * })
     */
    private $certificate;

    // getters and setters
}

Моя цель: Как автоматически сохранять изображения из родительского сертификата к дочернему сертификату при создании образов родительского сертификата из метода sonata configureFormFields?Я действительно ценю любую идею о том, как я могу достичь этого.Заранее спасибо.enter code here

1 Ответ

0 голосов
/ 07 мая 2019

Чтобы добавить изображение к вашему дочернему объекту, вы должны продублировать экземпляр TicketImage, поскольку его внешний ключ будет родительским. Вы можете попытаться сделать это так (не уверен, что без полного кода это понять сложно):

public function addImage(TicketImage $image): Ticket
 {
    $this->images->add($image);
    $image->setTicket($this); // works
    foreach($this->child as $child) {
        $cloneImg = clone $image;
        $cloneImg->setId(null);
        $cloneImg->setTicket($child);
        $child->setImage($cloneImg);
    }

    return $this;
 }

Но я думаю, что этот способ выглядит как хак, поэтому лучшим решением может быть еще раз подумать о вашем коде и, возможно, попытаться достать родительское изображение от детей, используя геттер для детей, вот так:

public function getImage(): TicketImage 
 {
    return $this->parent->getImages();
 }
...