Как работает ограничение Symfony2 UniqueEntity?

Прежде всего, я знаю, как использовать уникальные ограничения в Symfony2. Это больше вопрос о том, как это работает под капотом.

Например, у меня есть что-то вроде этого в качестве ограничения:

company\TestBundle\Entity\Answer:
constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
fields: [question, rank]

И у меня есть простая форма, с одним полем:

class AnswerLabelType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('label');
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'company\TestBundle\Entity\Answer'
));
}
}

Что я ожидал:

  • Каждый раз, когда я выбираю объект ответа и изменяю либо атрибут вопроса, либо атрибут ранга, он будет проверять, что новая пара значений вопрос / ранг еще не существует в базе данных.
  • С помощью вышеприведенной формы убедитесь, что ограничение уникальности бесполезно (с заметным исключением: в случае создания новой сущности ответа, но давайте рассмотрим, что это не цель этой формы).

Что, кажется, делает в реальности:

  • Он проверяет уникальное ограничение, когда я использую handleRequest() метод.

Эй, но ни атрибуты вопросов, ни вопросы не меняются, так как же так получится?

Более того, когда я просматривал логи, запрос на проверку ограничения выглядел так:

SELECT a.a, a.b, a.c, ... FROM Answer a WHERE a.question = ? AND a.rank = ?

Это довольно тяжелый запрос по сравнению с простым SELECT COUNT()..., COUNT должно быть достаточно, не так ли?

Это проблема для меня, потому что мой проект делает много маленьких обновлений, подобных приведенному выше, которые вызывают неоптимизированное поведение.

Я что-то не так понял? Могу ли я изменить это поведение?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]