[英]Validate UniqueEntity for One-To-Many, Unidirectional with Join Table [Symfony2]
我有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();
現在,我的問題在哪里?
我想框只能存儲唯一糖果(按名稱 ),這意味着盒可以存儲糖果對象與名稱“巧克力”和“橙色”,但不能“蛋黃醬”和“蛋黃醬”
制作糖果時,我無法使用UniqueEntity
約束進行驗證,因為糖果不知道盒子。 我考慮過Box的Callback
驗證器或創建自己的約束,但我認為最好問一下:
我該怎么辦?
答案來晚了,但可能會對某人有所幫助,所以這是我實現的解決方案:
就我而言,我只能通過表單在一個地方創建Candy
,因此最終我決定在我的控制器/服務中為該案例創建其他特殊驗證。
簡而言之,我以自己的方式進行了代碼檢查,當名稱無效時,表單會拋出Error
以防止創建。 我想強調一點,這是一個骯臟的解決方案,並且它也不具有可伸縮性,因為如果在其他地方創建Candy,則必須記住始終將其添加到正確的位置。
// special unique name validation
$candy_name = $form->get('name')->getData();
if($candy_name){
$found_candy = $box->getCandyByName($candy_name);
if($found_candy){
$error = new FormError( $this->get('translator')->trans("candy.name.exist", array(), "validators") );
$form->get('name')->addError($error);
}
}
無論如何,但根據您的情況, 回調可以是更好的解決方案,甚至可以是簡單的UniqueEntity
約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.