如果字段为空,则在以嵌入形式编辑父实体时删除子实体 - Symfony 4
Removing child entity when editing parent entity in embedded form if field is null - Symfony 4
我正在使用 symfony 4 并且我有两个实体;产品和产品图像。我在两者之间创建了 OneToOne 关系,并将 ProductImageType 表单嵌入到我的 ProductType 表单中,因为一个产品有一个图像。我在 ProductType 表单中嵌入的字段是属于 ProductType 实体的 'url'。
如果我将图像 url 留空,则在创建新产品时这一切都按预期工作,然后不会在 ProductImage table 中创建记录。如果我提供 url,则会创建一条记录。但是,如果我编辑具有图像 url 的产品并删除图像 url,则会出现错误。我希望的是,相关的 ProductImage 实体将在其 url 字段上设置为空,或者更好的是,相关的子 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;
}
ProductImage ccode:
/**
* @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,
])
ProductImage->$product 上的 orphanRemoval 可能吗?;
/**
* @ORM\OneToOne(targetEntity="...", orphanRemoval=true)
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
* @Assert\Type(type="App\Entity\Product")
*/
private $product;
ProductImage 实体中的 SetUrl 缺少“?”在 'string'.
之前
public function setUrl(?string $url): self
{
$this->url = $url;
return $this;
}
我正在使用 symfony 4 并且我有两个实体;产品和产品图像。我在两者之间创建了 OneToOne 关系,并将 ProductImageType 表单嵌入到我的 ProductType 表单中,因为一个产品有一个图像。我在 ProductType 表单中嵌入的字段是属于 ProductType 实体的 'url'。
如果我将图像 url 留空,则在创建新产品时这一切都按预期工作,然后不会在 ProductImage table 中创建记录。如果我提供 url,则会创建一条记录。但是,如果我编辑具有图像 url 的产品并删除图像 url,则会出现错误。我希望的是,相关的 ProductImage 实体将在其 url 字段上设置为空,或者更好的是,相关的子 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;
}
ProductImage ccode:
/**
* @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,
])
ProductImage->$product 上的 orphanRemoval 可能吗?;
/**
* @ORM\OneToOne(targetEntity="...", orphanRemoval=true)
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
* @Assert\Type(type="App\Entity\Product")
*/
private $product;
ProductImage 实体中的 SetUrl 缺少“?”在 'string'.
之前public function setUrl(?string $url): self
{
$this->url = $url;
return $this;
}