繁体   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