Я пытаюсь добавить ввод с подсчетом для создания регистрационного номера. например (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 будет объектом, строка задана
Есть идеи? Благодарю.
Вы не выбираете результат сущности из 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());
Если регистрационный номер генерируется при открытии формы, существует возможность присвоения того же номера нескольким пользователям. Это можно свести к минимуму, назначив регистрационный номер при отправке формы. Далее я также предполагаю, что в 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);
....
->getResult()
.