【发布时间】:2015-12-30 04:45:55
【问题描述】:
我有 2 个映射实体,
盒子
class Box{
//[...]
/**
* @ORM\ManyToMany(targetEntity="Candy", cascade={"remove"})
* @ORM\OrderBy({"power" = "DESC"})
* @ORM\JoinTable(name="box_candies",
* joinColumns={@ORM\JoinColumn(name="box_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="candy_id", referencedColumnName="id", unique=true)}
* )
*/
private $candies;
}
还有糖果
class Candy
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
//[...]
}
如您所见,这是一对多、单向和连接表关联。 Box可以“存储”糖果,但Candy对Box一无所知(在哪里)。
现在我有了可以制作糖果的页面,并且有表格和标准isValid(),然后:
$box->addCandy($candy);
$entity_manager->persist($candy);
$entity_manager->persist($box);
$entity_manager->flush();
现在,我的问题在哪里?
我想 Box 可以存储 only 唯一的糖果(按名称),这意味着 Box 可以存储名称为 “Choco”和“Orange”的 Candy 对象" 但不能“蛋黄酱”和“蛋黄酱”
制作糖果时,我无法使用UniqueEntity 约束进行验证,因为糖果不知道盒子的存在。我考虑过 Callback Box 的验证器或创建自己的约束,但我认为最好问一下:
我应该怎么做?
【问题讨论】:
-
请参阅 this post - 您应该在 Candy 实体的
name字段上添加UniqueEntity。当您在 Box 实体上执行@ManyToMany注释时,Doctrine 会自动将其视为您的复合主键并完全按照您的意愿强制执行唯一性。 -
不,在我的情况下
name不是唯一值 -
为什么不是唯一值?
-
在我的情况下,
Candy存在于许多Boxes中,但糖果名称对于每个Box都是唯一的,但并非同时适用于所有盒子 -
我不确定我是否理解 - 但 Candy 是它自己的实体,与 Boxes 的任何东西完全无关,对吗?所以你的糖果桌上永远不会有 2 个“巧克力”条目。然后,每个盒子将简单地链接到其中的任何糖果,并以您已经拥有的多对多关系。
标签: php symfony symfony-forms symfony-validator