Php 调用实体的setter以从另一实体的控制器更新其列
在将新预算插入数据库后,我需要更新客户机表的预算列,但它没有更新。这就是我在BudgetController::addAction中所做的工作: $Client声明成功地返回了客户机名称,但它设置setBudget的行似乎不起作用。我不知道如何进行这样的更新。我需要它在插入预算后根据预算表单中选定的客户id进行更新Php 调用实体的setter以从另一实体的控制器更新其列,php,symfony,doctrine-orm,relationship,Php,Symfony,Doctrine Orm,Relationship,在将新预算插入数据库后,我需要更新客户机表的预算列,但它没有更新。这就是我在BudgetController::addAction中所做的工作: $Client声明成功地返回了客户机名称,但它设置setBudget的行似乎不起作用。我不知道如何进行这样的更新。我需要它在插入预算后根据预算表单中选定的客户id进行更新 客户和预算分别与oneToMany和manyToOne有关,我是否因为这种关系而遗漏了什么 如果预算实体是客户端的多通关联,则应使用->addBudget而不是setter。对客户机
客户和预算分别与oneToMany和manyToOne有关,我是否因为这种关系而遗漏了什么 如果预算实体是客户端的多通关联,则应使用->addBudget而不是setter。对客户机实体执行->查找可能比->获取引用更好。如果确实要保存到数据库的额外行程,请使用预算实体上的setter设置由->getReference创建的$client代理,即$Budget->setClient$client;。但是找到客户机并不昂贵,而且它确保了该id的客户机存在。然后,再次刷新管理器也是一个好主意,只是为了确保事情被干净地包装好,而不是假设当内核终止时,所有这些都会发生而不会中断。控制器和操作的完整格式副本应如下所示:
我可以知道setBudget的参数吗?@kdlcruz setBudget是客户端实体的setter方法,而不是任何自定义函数,如getLastId,获取它吗?这是一个整数字段,用于在添加新客户机后存储每个客户机的预算。好的,但是如果它只是setter,那么将更新客户机预算的->update或->save方法在哪里,或者该方法是否也包含在setBudget中?也许$Client->update或'$Client->save'可以解决您的问题。@kdlcruz哦,我已经为此编写了一个函数,但是在执行该方法时,由于查询而引发了一个语义错误,而且我还被告知使用OOP方法是一个更好的主意。如果您愿意,您可以查看我的:-
if ($form->isValid()) {
$manager->persist($form->getData());
$manager->flush();
$Client = $manager->getReference('PanelBundle:Client', $form['client_id']->getData()->getId());
$Client->setBudget($manager->getRepository('PanelBundle:Budget')->getLastId());
$this->addFlash('success', 'Novo orçamento adicionado');
return $this->redirect($this->generateUrl('panel_budgets'));
}
namespace PanelBundle\Controller;
use PanelBundle\Entity\Budget;
use PanelBundle\Form\Type\BudgetType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class BudgetController extends Controller
{
public function addAction(Request $request)
{
$budget = new Budget();
$budgetForm = $this->createForm(new BudgetType(), $budget);
$budgetForm->handleRequest($request);
if ($budgetForm->isValid()) {
$manager = $this->getDoctrine()->getManager();
$manager->persist($budget);
$manager->flush();
$client = $manager->getRepository('PanelBundle:Client')
->find($budgetForm->get('client_id')->getData())
;
$client->addBudget($budget);
$manager->flush();
$this->addFlash('success', 'Novo orçamento adicionado');
return $this->redirect($this->generateUrl('panel_budgets'));
}
return $this->render(
'PanelBundle:Budget:add.html.twig',
array(
'budgetForm' => $budgetForm->createView(),
)
);
}
}