簡體   English   中英

使用聯接表[Symfony2]驗證一對多,單向的UniqueEntity

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM