Удаление дочерней сущности при редактировании родительской сущности во встроенной форме, если поле пустое - Symfony 4 - PullRequest
0 голосов
/ 25 февраля 2019

Я использую Symfony 4, и у меня есть две сущности;Продукт и ProductImage.Я создал отношения OneToOne между ними, и я встроил форму ProductImageType в свою форму ProductType, поскольку один продукт имеет одно изображение.Поле, встроенное в форму ProductType, - это «url», принадлежащее сущности ProductType.

Все это работает, как и ожидалось, при создании нового продукта, если я оставляю URL-адрес изображения пустым, тогда запись не создаетсяв таблице ProductImage.И если я предоставлю URL, то запись будет создана.Однако, если я отредактирую продукт с URL-адресом изображения и удалил URL-адрес изображения, я получу сообщение об ошибке.Я надеялся на то, что соответствующая сущность ProductImage будет просто установлена ​​в значение null в его поле URL или, что еще лучше, связанный дочерний ProductImage будет просто полностью удален из базы данных.Я получаю сообщение об ошибке:

Expected argument of type "string", "NULL" given at property path "url".

Я не понимаю, как это происходит, поскольку поле url для ProductImage может быть пустым.Каков наилучший способ исправить это?Любая помощь с благодарностью!

Код товара:

/**
 * @ORM\OneToOne(targetEntity="App\Entity\ProductImage", mappedBy="product", cascade={"persist", "remove"})
 */
private $image;

public function getImage(): ?ProductImage
{
    return $this->image;
}

public function setImage(ProductImage $image): self
{
    $this->image = $image;

    if ($this !== $image->getProduct()) {
        $image->setProduct($this);
    }

    return $this;
}

Код продукта ProductImage:

/**
 * @ORM\Column(type="string", length=255, nullable=true)
 */
private $url;

/**
 * @ORM\OneToOne(targetEntity="App\Entity\Product", inversedBy="image", cascade={"persist", "remove"})
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
 * @Assert\Type(type="App\Entity\Product")
 */
private $product;

public function getProduct(): ?Product
{
    return $this->product;
}

public function setProduct(Product $product): self
{
    $this->product = $product;

    return $this;
}

Код ProductImageType:

->add('url', TextType::class, [
    'label' => 'Image Url',
        'attr' => [
            'placeholder' => 'A url to the image of this Product.'
        ]
    ]);

Код ProductType:

->add('image', ProductImageType::class, [
    'required' => false,
])

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

SetUrl в сущности ProductImage отсутствовал символ '?'перед строкой.

public function setUrl(?string $url): self
{
    $this->url = $url;

    return $this;
}
0 голосов
/ 25 февраля 2019

Может быть orphanRemoval на ProductImage -> $ product?;

/**
* @ORM\OneToOne(targetEntity="...", orphanRemoval=true)
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
* @Assert\Type(type="App\Entity\Product")
*/

private $product;

...