Intentando actualizar una tabla luego de insertarla en otra con Symfony2 y Doctrine2

Escribí una función en BudgetRepository que se llama al insertar nuevos datos en la tabla de Presupuesto. La función es:

 public function addBudgetToClient($clientId, $budgetId) { return $this->createQueryBuilder('b') ->update('PanelBundle:Client', 'c') ->set('c.budget', $budgetId) ->where('c.id = ' . $clientId) ->getQuery() ->execute(); } 

Y el BudgetController hace esto:

 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 ambas salidas, getLastId también es una función personalizada que escribí para recuperar la identificación más grande de Budget, y $form['client_id']->getData()->getId() también recupera la identificación del cliente. Supongo que Symfony2 automáticamente hace algo porque Budget y Client están relacionados, e incluso al guardar el ID del cliente, en la base de datos se muestra el nombre del cliente, no entiendo cómo realmente.

El problema aquí son estos errores:

[Error semántico] línea 0, col 34 cerca de ‘budget = 4 WHERE’: Error: PathExpression inválido. StateFieldPathExpression o SingleValuedAssociationField esperado.

[2/2] QueryException: [Semantical Error] línea 0, col 34 cerca de ‘budget = 4 WHERE’: Error: PathExpression inválido. StateFieldPathExpression o SingleValuedAssociationField esperado. +

[1/2] QueryException: UPDATE PanelBundle: Client c SET c.budget = 4 WHERE c.id = 1 +

Encontré muchos problemas sobre esta excepción, pero no la han tenido con la función de update , solo select .

No debe generar una consulta de actualización para este caso utilizando un queryBuilder. Use el enfoque OOP para actualizar sus entidades.

 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')); }