Symfony 3:通过一个控制器添加两个不同的实体 实体控制器环境

问题描述

我有3个实体:

[Formula] ----OnetoMany----> [FormulaParameter] ---ManyToOne---> [Parameter]

我需要在FormulaParameter之间建立联接表,因为该关系包含名称,值等信息。

实体

class Formula
{
    /**
     * @ORM\OnetoMany(targetEntity="FormulaDeFinitionParameter",mappedBy="formula",cascade={"all"},orphanRemoval=true)
     */
    private $parameters;
}
class FormulaParameter
{
    /**
     * @ORM\ManyToOne(targetEntity="Formula",cascade={"persist"})
     * @ORM\JoinColumn(referencedColumnName="id",nullable=false)
     */
    private $formula;

    /**
     * @ORM\ManyToOne(targetEntity="Parameter")
     * @ORM\JoinColumn(referencedColumnName="id",nullable=false)
     */
    private $parameterFormat;

    /**
     * @var string|null
     * @ORM\Column(name="parameter_name",type="string",length=1000,nullable=true)
     */
    private $name;
}

控制器

我仅使用一种形式将两个记录都添加数据库中:出于结构原因,我选择检索用于分别填充FormulaParameter记录的值,并对控制器中的元数据进行后处理。

这是我的代码的简化版本:

public function addFormulaAction(Request $request,$id)
{
    $session = $request->getSession();
    $em = $this->getDoctrine()->getManager();

    if ($id) {
        $formula = $this->selectData($session,$id,"Formula");
    } else {
        $formula = new \TAMAS\AstroBundle\Entity\Formula();
    }
   
    $form = $this->get('form.factory')->create(\App\Form\FormulaType::class,$formulaDeFinition);

    if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
        // MetaDATA RETRIEVAL
        $params = $form->get('parameter')->getData();
        foreach ($params as $id => $param){
            // CREATION OF THE FORMULA ParaMETER
            $paramFormula = new E\FormulaParameter();
            $paramFormula->setParameterFormat($em->find("Parameter",$id));
            if (isset($param["name"]) && $param["name"]){
                $paramFormula->setName($param["name"]);
            }
            $paramFormula->setFormula($formula);
            // ADDITION OF THE FORMULA ParaMETER TO THE DATABASE
            $em->persist($paramFormula);
            $em->flush();
        }

        // ADDITION OF THE FORMULA TO THE DATABASE
        $em->persist($formula);
        $em->flush();
        
        return $this->redirectToRoute('home');
    }

    return $this->render('addFormula.html.twig',array(
        'form' => $form->createView(),'formula' => $formula
    ));
}

如您所见,我要实现的是将来自不同实体的2条记录添加到同一控制器中的数据库。我已经尝试了好几件事,但是都没有用。通常触发的错误是这样的:

An exception occurred while executing 'INSERT INTO formula_parameter (...) VALUES (?,?,?)' with params [...]

您知道我该怎么做吗?

环境

Symfony version: 3.4.3
PHP version: 7.2.24
Firefox / Ubuntu 10.15.5

解决方法

为了通过ParameterFormula表单控制器添加Formula,我只需要向addParameter()实体添加Formula方法,如下所示:>

/**
 * Add parameter
 * @param FormulaParameter $parameter
 * @return Formula
 */
public function addParameter(FormulaParameter $parameter)
{
    $this->parameters->add($parameter);
    return $this;
}

然后在Controller内部使用此方法:

foreach ($params as $id => $param){
    // CREATION OF THE FORMULA PARAMETER
    $paramFormula = new E\FormulaParameter();
    $paramFormula->setParameter($em->find("Parameter",$id));
    if (isset($param["name"]) && $param["name"]){
          $paramFormula->setName($param["name"]);
    }
    $paramFormula->setFormula($formula);
    // ADDITION TO THE FORMULA PARAMETER
    $formula->addParameter($paramFormula);
}