在坚持之前,Doctrine Symfony检查记录

时间:2015-04-02 09:41:50

标签: php validation doctrine-orm dql symfony-2.6

在保留表单之前检查记录是否存在的最佳方法是什么?

  • 使用Pre Perist?但我可以使用查询
  • 在控制器中使用查询,如果存在则抛出异常
  • 使用我班级的资料库

我重新使用https://stackoverflow.com/a/10688065/3942705来查询php / mysql,但我想用symfony来做。

2 个答案:

答案 0 :(得分:1)

我将发布一个解决方案,这可能不是最佳性能方案,但它可以工作,您可以进一步优化它。

假设:AcmeBundle是您的包名称空间,ProductMedia是您的实体。您需要为产品添加验证,我已使用YML,您可以更改此内容。

在:AcmeBundle\Resources\config\validation.yml

AcmeBundle\Entity\Product:
    constraints:
        - Callback: { methods: [validate] }

在:AcmeBundle\Entity\Product

class Product
{
    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    private $media;

    [...]

    /**
     * @param ExecutionContextInterface $context
     */
    public function validate(ExecutionContextInterface $context)
    {
        $allowedPositions = array(1, 2, 3, 4);

        foreach ($allowedPositions as $position) {
            $atThisPosition = $this->media->filter(function(Media $media) {
                return $media->getPosition() === $position;
            });

            $count = $atThisPosition->count();

            if ($count > 1) {
                $context->addViolationAt('media', sprintf("Trying to set %d media at position %d", $count, $position));
            }
        }
    }
}

答案 1 :(得分:0)

好的,如果您希望您的记录是唯一的,那么您可以使用实体验证来检查记录是否唯一。假设您有一个User实体。您希望如果用户的电子邮件或用户名已经存在,那么用户将无法继续使用db,可以通过检查电子邮件和用户名属性来确定这些是否已经存在,这意味着那些是独一无二的。有关实体验证的详细信息,您可以看到以下链接:http://symfony.com/doc/current/book/validation.html

更具体地说,如果您想了解UniqueEntity validaiton,您可以看到以下链接:http://symfony.com/doc/current/reference/constraints/UniqueEntity.html#basic-usage

祝你好运