Я написал функцию в BudgetRepository
которая вызывается при вставке новых данных в таблицу бюджета. Функция:
public function addBudgetToClient($clientId, $budgetId) { return $this->createQueryBuilder('b') ->update('PanelBundle:Client', 'c') ->set('c.budget', $budgetId) ->where('c.id = ' . $clientId) ->getQuery() ->execute(); }
И BudgetController
делает это:
public function addAction(Request $request) { $form = $this->createForm(new BudgetType()); $manager = $this->getDoctrine()->getManager(); $Budget = $manager->getRepository('PanelBundle:Budget'); $Client = $manager->getRepository('PanelBundle:Client'); if ($request->getMethod() == 'POST') { $form->handleRequest($request); if ($form->isValid()) { $manager->persist($form->getData()); $manager->flush(); // Here's the method: $Budget->addBudgetToClient($form['client_id']->getData()->getId(), $Budget->getLastId()); // $this->addFlash('success', 'Novo orçamento adicionado'); return $this->redirect($this->generateUrl('panel_budgets')); } } return $this->render('PanelBundle:Budget:add.html.twig', array( 'clients' => $Client->findAll(), 'form' => $form->createView() )); }
Я тестировал оба выхода, getLastId
также является настраиваемой функцией, которую я написал для получения самого большого идентификатора из бюджета, а $form['client_id']->getData()->getId()
также извлекает идентификатор клиента. Я думаю, что Symfony2 автоматически что-то делает, потому что бюджет и клиент связаны, и даже сохраняя идентификатор клиента, в базе данных отображается имя Клиента, я не понимаю, как на самом деле.
Здесь возникают следующие ошибки:
[Semantical Error] строка 0, col 34 около 'budget = 4 WHERE': Ошибка: Invalid PathExpression. StateFieldPathExpression или SingleValuedAssociationField ожидается.
- Как запустить тесты Behat, когда есть ошибки уровня E_USER_DEPRECATED
- Symfony2: Как ввести ВСЕ параметры в службу?
- Почему Symfony2 не перехватывает исключения
- Созданный Symfony Bundle не работает
- Пользовательский вход с использованием третьего параметра
[2/2] QueryException: строка [Semantical Error] 0, col 34 около 'budget = 4 WHERE': Ошибка: Invalid PathExpression. StateFieldPathExpression или SingleValuedAssociationField ожидается. +
[1/2] QueryException: UPDATE PanelBundle: клиент c SET c.budget = 4 WHERE c.id = 1 +
Я нашел много проблем об этом исключении, но у них его не было с функцией update
, только select
.
Вы не должны создавать запрос обновления для этого случая с помощью queryBuilder. Используйте подход ООП для обновления ваших объектов.
if ($form->isValid()) { $budgetEntity = $form->getData(); $manager->persist($budgetEntity); $clientEntity = $Budget->find($form['client_id']->getData()->getId()); $clientEntity->setBudget($budgetEntity); $manager->flush(); $this->addFlash('success', 'Novo orçamento adicionado'); return $this->redirect($this->generateUrl('panel_budgets')); }