Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 保存之前的原则Symfony检查记录_Php_Validation_Doctrine Orm_Dql_Symfony 2.6 - Fatal编程技术网

Php 保存之前的原则Symfony检查记录

Php 保存之前的原则Symfony检查记录,php,validation,doctrine-orm,dql,symfony-2.6,Php,Validation,Doctrine Orm,Dql,Symfony 2.6,在保存表单之前,检查记录是否存在的最佳方法是什么 使用Pre Perist?但是我可以使用查询吗 在控制器中使用查询,如果存在,则抛出异常 使用我的类的存储库 我在php/mysql中查询时使用了此选项,但我希望使用symfony来实现此功能。我将发布一个解决方案,这可能不是最佳性能方案,但它可以工作,您可以进一步优化它 假设:AcmeBundle是您的包名称空间,Product和Media是您的实体。你需要为你的产品添加一个验证,我已经用过了,你可以更改这个 位于:AcmeBundle\R

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

  • 使用Pre Perist?但是我可以使用查询吗
  • 在控制器中使用查询,如果存在,则抛出异常
  • 使用我的类的存储库

我在php/mysql中查询时使用了此选项,但我希望使用symfony来实现此功能。

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

假设:
AcmeBundle
是您的包名称空间,
Product
Media
是您的实体。你需要为你的产品添加一个验证,我已经用过了,你可以更改这个

位于:
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));
            }
        }
    }
}

好的,如果希望记录是唯一的,那么可以使用实体验证来检查记录是否唯一。假设您有一个用户实体。您希望如果用户的电子邮件或用户名已经存在,那么用户将无法在db上持久化,可以通过检查电子邮件和用户名属性来完成,这意味着它们是否已经存在,这意味着它们是否唯一。有关实体验证的详细信息,请参见以下链接:

更具体地说,如果您想了解Uniquentity validaiton,您可以查看以下链接:


祝你好运,这取决于你检查的目的。如果您有唯一的列,您可以应用验证等。假设我有一个图像位置字段(1,2,3,4,…),单位为DB,对应于产品的图像位置。我不能使用unique,因为我可以为不同的产品设置两个位置1。所以我想检查产品“n”的新图像的位置是否不同。如果nok大于,我将给出一条错误消息。我希望我的解释更准确。那么一个
产品
可以有许多
图像
实体?你想确保一个产品内部的图像位置只拍摄一次吗?事实上,一个产品可以有很多图像。此产品的图像位置必须不同/唯一。因此,如果我已经在DB中有一个位置为2的图像,并且我添加了一个新的图像,那么这个位置必须与2不同。谢谢你的建议。