Удаление дочернего объекта при редактировании родительского объекта во встроенной форме, если поле равно null - Symfony 4

Я использую Symfony 4, и у меня есть две сущности; Продукт и Изображение Продукта. Я создал отношение 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;
}

Код изображения продукта:

/**
 * @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.'
        ]
    ]);

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

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

Возможно, проблема с кешем, очистите его и попробуйте еще раз - поскольку вы правы с ?string, он не должен выдавать эту ошибку.

rebru 25.02.2019 12:44

Спасибо за ваш комментарий, я только что очистил весь свой кеш и снова перенес новую базу данных, но, к сожалению, все та же проблема. Редактировать На самом деле я только что заметил, что метод set url не должен был быть включен в мой вопрос, поскольку он предназначен для отдельного свойства url в объекте Product. @ребру

DBarkz 25.02.2019 12:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
404
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, orphanRemoval для ProductImage->$product?;

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

private $product;

Ответ принят как подходящий

SetUrl в объекте ProductImage отсутствовал '?' перед «строкой».

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

    return $this;
}

Другие вопросы по теме