繁体   English   中英

如果字段为空,则在嵌入表单中编辑父实体时删除子实体 - Symfony 4

[英]Removing child entity when editing parent entity in embedded form if field is null - Symfony 4

我正在使用 symfony 4 并且我有两个实体; 一个产品和一个产品图片。 我在两者之间创建了一个 OneToOne 关系,并且我在我的 ProductType 表单中嵌入了 ProductImageType 表单,因为一个产品有一个图像。 我在 ProductType 表单中嵌入的字段是“url”,它属于 ProductType 实体。

如果我将图像 url 留空,那么在创建新产品时,这一切都按预期工作,然后在 ProductImage 表中不会创建记录。 如果我提供一个 url,则会创建一条记录。 但是,如果我编辑具有图像 url 的产品并删除图像 url,则会出现错误。 我希望的是相关的 ProductImage 实体将在其 url 字段上设置为 null 或者更好的是,相关的子 ProductImage 将完全从数据库中删除。 我收到的错误是:

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

我不明白这是怎么发生的,因为 ProductImage 的 url 字段允许为空。 解决这个问题的最佳方法是什么? 非常感谢任何帮助!

产品代码:

/**
 * @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;
}

产品图片类型代码:

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

产品类型代码:

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

ProductImage 实体中的 SetUrl 缺少“?” 在“字符串”之前。

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

    return $this;
}

也许 orphanRemoval 在 ProductImage->$product 上?;

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

private $product;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM