У меня есть сущность, но я хочу проверить максимум X записей в db. Например, допустимо не более 5 категорий в БД. Я пытаюсь проверить, не решена ли какая-либо проверка правильности моей проблемы, но я не нахожу ничего полезного. Заранее благодаренМаксимальное количество записей
ответ
Если вам необходимо проверить свою сущность в нескольких местах или выполнить этот тип проверки для более чем одного класса сущностей, вы можете написать специальное ограничение проверки для этого. Это немного похоже на перебор, но это технически «правильное» решение. Это описано в Руководстве по Symfony в How to create a Custom Validation Constraint. Например:
Constraint класс:
<?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 (я обычно трачу больше времени на размышления о наиболее значимом имени). Кроме того, класс validator в настоящее время не содержит защиты для применения к классу, который не является объектом доктрины.
Возможно, вам придется реализовать это самостоятельно. Я такого не видел, но было бы непросто сделать что-то свое. Просто добавьте функцию, чтобы проверить, сколько записей у вас есть в db, и вызовите эту функцию, прежде чем вставлять что-либо.
Нечто подобное можно сделать:
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;
}
Это непроверенный код, но что-то вдоль этих линий должны вы на правильном пути.
Спасибо, но это не то, что я хочу сделать. Я думал прямо в ограничении проверки. Я даже не задумываюсь в слушателе доктрины для prepersist :(Может быть, решение с использованием проверки обратного вызова (@Assert \ Callback) ... – Oriam
- 1. Максимальное количество записей хроники
- 2. Максимальное количество записей в ListBox
- 3. Максимальное количество записей, разрешенных в наборе записей?
- 4. Количество записей превышено максимальное целочисленное значение
- 5. SQL максимальное количество записей с общим значением
- 6. Глобальные временные таблицы Oracle - максимальное количество записей?
- 7. Максимальное количество записей в файле histogram_bounds
- 8. Максимальное количество записей в таблице базы данных
- 9. есть ли максимальное количество записей для MongoDB?
- 10. SQL, как извлечь максимальное количество записей
- 11. Как найти максимальное количество связанных записей?
- 12. Что такое максимальное количество записей, которое может хранить таблица MySQL?
- 13. Как запросить максимальное количество сгруппированных записей и отобразить эту дату
- 14. Максимальное количество записей битового поля в структуре C?
- 15. Максимальное количество записей, введенных за день в таблице db
- 16. Какое максимальное количество записей и таблиц поддерживает MYSQL?
- 17. Какое максимальное количество записей я могу видеть в Notepad ++?
- 18. Как установить максимальное количество записей в файле flatfileItemReader?
- 19. Выберите количество записей, которые имеют максимальное значение в диапазоне
- 20. Получить максимальное количество последовательных повторяющихся записей в MySQL
- 21. Как ограничить максимальное количество значений (записей) в списке
- 22. Какое максимальное количество записей о магазине возможно в сценарии свиньи?
- 23. Максимальное количество записей с использованием подстановочных знаков в mysql
- 24. Каково максимальное количество записей для DataGrid в VB.NET?
- 25. почему facebook максимальное количество управляемых учетных записей, показывающих нуль
- 26. Как найти максимальное количество записей для определенного ключа в таблице
- 27. Разрешить максимальное количество записей при применении определенных условий
- 28. Какое максимальное количество записей можно сохранить в одном EntityCollection?
- 29. Уточнение «Максимальное количество записей, возвращаемых сервером» в ArcGIS Desktop?
- 30. Выберите максимальное количество повторных записей в таблице SQL
Идеально, это то, что я искал. Я еще не тестировал его, но спасибо! – Oriam