Intereting Posts

Попытка обновить одну таблицу после вставки в другую с помощью Symfony2 и Doctrine2

Я написал функцию в 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 ожидается.

[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 .

Related of "Попытка обновить одну таблицу после вставки в другую с помощью Symfony2 и Doctrine2"

Вы не должны создавать запрос обновления для этого случая с помощью 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')); }