问题描述
我有3个实体:
[Formula] ----OnetoMany----> [FormulaParameter] ---ManyToOne---> [Parameter]
我需要在Formula
和Parameter
之间建立联接表,因为该关系包含名称,值等信息。
实体
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);
}