Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 调用实体的setter以从另一实体的控制器更新其列_Php_Symfony_Doctrine Orm_Relationship - Fatal编程技术网

Php 调用实体的setter以从另一实体的控制器更新其列

Php 调用实体的setter以从另一实体的控制器更新其列,php,symfony,doctrine-orm,relationship,Php,Symfony,Doctrine Orm,Relationship,在将新预算插入数据库后,我需要更新客户机表的预算列,但它没有更新。这就是我在BudgetController::addAction中所做的工作: $Client声明成功地返回了客户机名称,但它设置setBudget的行似乎不起作用。我不知道如何进行这样的更新。我需要它在插入预算后根据预算表单中选定的客户id进行更新 客户和预算分别与oneToMany和manyToOne有关,我是否因为这种关系而遗漏了什么 如果预算实体是客户端的多通关联,则应使用->addBudget而不是setter。对客户机

在将新预算插入数据库后,我需要更新客户机表的预算列,但它没有更新。这就是我在BudgetController::addAction中所做的工作:

$Client声明成功地返回了客户机名称,但它设置setBudget的行似乎不起作用。我不知道如何进行这样的更新。我需要它在插入预算后根据预算表单中选定的客户id进行更新


客户和预算分别与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(),
            )
        );
    }
}