【问题标题】:Doctrine Symfony check record before persist坚持之前的 Doctrine Symfony 检查记录
【发布时间】:2015-04-02 09:41:49
【问题描述】:

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

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

我把这个https://stackoverflow.com/a/10688065/3942705 加红用于在 php/mysql 中查询,但我想用 symfony 来做。

【问题讨论】:

  • 这取决于你检查的目的是什么。如果您有唯一的列,则可以应用验证等。
  • 假设我在 DB 中有一个图像位置字段 (1,2,3,4,...),对应于产品图像的位置。我不能使用独特的,因为我可以为不同的产品设置两个位置 1。所以我想检查产品“n”是否为新图像提供的位置不同。如果不超过,我会给出一条错误消息。我希望我的解释更准确。
  • 所以一个Product 可以有多个Image 实体?并且您想确保产品内的图片位置只拍摄一次?
  • 确实,一个产品可以有许多图像。此产品的图像位置必须不同/唯一。因此,如果我在 DB 中已经有一个位置为 2 的图像并且我添加了一个新图像,那么这个位置必须与 2 不同。谢谢您的建议。

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


【解决方案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));
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    好的,如果您希望您的记录是唯一的,那么您可以使用实体验证来检查记录是否是唯一的。假设您有一个用户实体。您希望如果用户的电子邮件或用户名已经存在,那么用户将无法在数据库上持久化,可以通过检查电子邮件和用户名属性来完成这些是否已经存在,这意味着它们是唯一的或不是。有关实体验证的详细信息,您可以查看以下链接:http://symfony.com/doc/current/book/validation.html

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

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 2014-04-18
      • 2019-04-09
      • 2014-06-11
      相关资源
      最近更新 更多