我有一个父实体产品,在很多家族中都可以。
家庭属性显示为CollectionType。目的是创建我们想要的尽可能多的家庭,但是每个家庭的名称对于该产品必须是唯一的。
当我在家庭表中有数据时,它工作正常;但是当它为空时,我立即为我的产品添加两个家族,且名称相同,则不会触发@UniqueEntity;否则,这是ORM uniqueConstraints的响应方式。
执行“ INSERT INTO”时发生异常 系列(名称,max_product,必填,created_at, 带有参数的VALUES(?,?,?,?,?,?,?)' [“ toto”,1,0,“ 2018-12-06 14:54:13”,“ 2018-12-06 14:54:13”,1]:
在我的实体下面:
/**
* @var Family[]|ArrayCollection
*
* @ORM\OneToMany(targetEntity=Family::class, mappedBy="product", fetch="LAZY", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\OrderBy({"id" = "ASC"})
* @Assert\Valid
*/
private $families;
和
/**
* @ORM\Entity(repositoryClass=ProductCollectionFamilyRepository::class)
* @ORM\Table(name="product_collection_family",
* indexes={@ORM\Index(name="IDX_FAMILY_NAME", columns={"name"})},
* uniqueConstraints={
* @ORM\UniqueConstraint(columns={"promotion_id", "name"})
* }
* )
*
* 2.5.4.5RG02
*
* @UniqueEntity(
* fields={"product", "name"},
* errorPath="name",
* message="backend.error.label.family.unique_entity"
* )
*/
class Family
{
use TimestampableEntity;
use ProductCollectionTrait;
/**
* @var int
*
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string", length=100)
* @Assert\NotBlank
* @Assert\Length(min="1", max="100", minMessage="backend.error.label.short", maxMessage="backend.error.label.long")
*/
private $name;
/**
* @var Product
*
* @ORM\ManyToOne(targetEntity=Product::class, inversedBy="families", fetch="LAZY")
* @ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=true)
* @Assert\NotBlank
*/
private $product;
}
有什么想法吗?
答案 0 :(得分:0)
在执行此操作时,我只创建了一个断言回调函数来检查数组集合中的元素,然后建立一个冲突。
/**
* @Assert\Callback
*
* @param ExecutionContextInterface $context
* @param $payload
*/
public function validate(ExecutionContextInterface $context, $payload)
{
$productFamilies = clone $this->getProductFamilies();
$productFamiliesFiltered = $this->getProductFamilies()->filter(function ($currentProductFamily) use ($productFamilies) {
// Remove current family from original collection
$productFamilies->removeElement($currentProductFamily);
foreach ($productFamilies as $data) {
//we have same name ?
if ($currentProductFamily->getName() === $data->getName()) {
return true;
}
}
return false;
});
if (0 !== $productCollectionFiltered->count()) {
$context->buildViolation('backend.error.label.product_family.unique_entity')
->atPath('productFamilies')
->addViolation();
}
}