最大条目数

时间:2014-01-17 21:01:54

标签: symfony doctrine-orm entity

我有一些实体,但我想在db中验证最多X个条目。 例如,允许在DB中不超过5个类别。 我试着看看是否有一些约束验证解决了我的麻烦,但我没有发现任何有用的东西。 提前谢谢

2 个答案:

答案 0 :(得分:0)

您可能需要自己实施。我没有看到任何这样的事情,但做一个属于你自己的并不困难。只需添加一个函数来检查数据库中有多少条目,并在插入任何内容之前调用此函数。

可以这样做:

public function newAction(){
    $isAllowed = $this->checkMaxRecords();

    if($isAllowed){
        //save to the database
    }
}

private function checkMaxRecords(){
    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery(
       'SELECT c
        FROM AcmeStoreBundle:Category c'
    );

    $category = $query->getResult();

    if(count($category) >= 5){
        return false;
    }
    return true;
}

这是未经测试的代码,但沿着这些方向的某些内容可以让您走上正确的轨道。

答案 1 :(得分:0)

如果您需要在多个地方验证您的实体或对多个实体类进行此类验证,您可以编写自定义验证约束来执行此操作。它确实有点像矫枉过正,但它在技术上是'正确'的解决方案。这在How to create a Custom Validation Constraint中的Symfony手册中有记录。例如:

约束类:

<?php

namespace Your\Bundle\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

class MaxEntries extends Constraint
{
    public $message = 'The maximum %max% %name% entries already exist.';
    public $max = 5;

    public function validatedBy()
    {
        return 'maxEntries';
    }

    public function getTargets()
    {
        return self::CLASS_CONSTRAINT;
    }
}

ConstraintValidator类:

<?php

namespace Your\Bundle\Validator\Constraints;

use Doctrine\ORM\EntityManager;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class MaxEntriesValidator extends ConstraintValidator
{
    private $entityManager;

    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function validate($protocol, Constraint $constraint)
    {
        /** @var MaxEntries $constraint */

        $protocolClass = new \ReflectionClass(get_class($protocol));
        $entityName = $protocolClass->getShortName();
        // alternative to next 2 lines - you could use dql to do a select count
        $repository = $this->entityManager->getRepository('YourBundle:' . $entityName);
        $entities = $repository->findAll();

        if (count($entities) == $constraint->max)
        {
            $this->context->addViolation($constraint->message, array(
                '%max%' => $constraint->max,
                '%name%' => $entityName,
            ));
        }
    }
}

services.yml:

validator.max_entries:
    class: Bullitt\TargetNeutral\SpectatorBundle\Validator\Constraints\MaxEntriesValidator
    arguments:    [@doctrine.orm.entity_manager]
    tags:
        - { name: validator.constraint_validator, alias: maxEntries }

validation.yml:

Your\Bundle\YourEntity:
    constraints:
        - Your\Bundle\Validator\Constraints\MaxEntries:
            # You can override the default constraint attributes here
            message: "Failed! The maximum %max% %name% entries already exist."
            max: 42

注意,您可能能够提出比MaxEntries更好的名称(我通常会花更多时间考虑最有意义的名称)。此外,验证程序类当前不包含将其应用于非逻辑实体的类的保护。