Symfony2 buildForm - добавление ввода типа сущности со счетчиком

0

Я пытаюсь добавить ввод с подсчетом для создания регистрационного номера. например (2/2014) 2 → счет + 1 2014 → год

Я использую этот код:

            ->add('registration_number', 'entity', array(
            'class' => 'FrontBundle:User',
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('u')
                    ->select('count(u.id)')
                    ->groupBy('u.id')
                    ->getQuery()
                    ->getResult();
            },
        ))

но я получаю ошибку:

Ожидаемый аргумент типа Doctrine\ORM\QueryBuilder, заданный array.

Я пробовал эти решения без успеха

1- удаление строки → getResult().

return $er->createQueryBuilder('u')
                    ->select('count(u.id)')
                    ->groupBy('u.id')
                    ->getQuery();

Ошибка:

Ожидаемый аргумент типа "Doctrine\ORM\QueryBuilder", "Doctrine\ORM\Query"

2- удаление последних двух строк

return $er->createQueryBuilder('u')
                    ->select('count(u.id)');

Ошибка:

Предупреждение: get_class() ожидает, что параметр 1 будет объектом, строка задана

Есть идеи? Благодарю.

  • 0
    удалить строку ->getResult() .
  • 0
    Я уже пробовал это, но я получаю ошибку: ожидаемый аргумент типа "Doctrine \ ORM \ QueryBuilder", "Doctrine \ ORM \ Query"
Показать ещё 6 комментариев
Теги:
doctrine2

2 ответа

2

Вы не выбираете результат сущности из EntityRepository. Дикое предположение: оно возвращает строку COUNT(u.id) вместо набора сущностей.

Похоже, что тип формы 'entity' не подходит для вашей задачи. Если вам нужно добавить регистрационный номер, я считаю, что это должен быть текстовый ввод (или, может быть, скрытое поле, зависит от того, что вы хотите). Таким образом, вы не должны добавлять поле объекта, вы должны заранее создать регистрационный номер и передать его вместе с данными формы. Если вы создаете форму для пользователя, это может выглядеть так:

// Your controller action
$user = new \FrontBundle\Entity\User();

$qb = $this->getDoctrine()->getRepository('FrontBundle:User')->createQueryBuilder('u');

$regNumber = $qb->select('count(u.id)')
                 ->groupBy('u.id')
                 ->getQuery()
                 ->getResult();

$user->setRegNumber($regNumber);

$form = $this->createForm(new UserType(), $user);

// Your form
// @var FormBuilderInterface $formBuilder
$formBuilder->add('regNumber', 'text', array());
0

Если регистрационный номер генерируется при открытии формы, существует возможность присвоения того же номера нескольким пользователям. Это можно свести к минимуму, назначив регистрационный номер при отправке формы. Далее я также предполагаю, что в registrationNumber User существует свойство registrationNumber. Это выглядит примерно так:

контроллер

...
$em = $this->getDoctrine()->getManger();
...
if ($form->isValid()) {
    ...
    $allUsers = $em->getRepository("YourBundle:User")->findAll();
    $n = count($allUsers) + 1;
    $date = new \DateTime();
    $year = date_format($date, 'Y');
    // make it sortable
    $l = strlen($n);
    $regNumber = $year . str_repeat('0', 5 - $l) . $n;
    $user->setRegistrationNumber($regNumber);
    ....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню