我有三个实体:
[Formula] ----OneToMany----> [FormulaParameter] ---ManyToOne---> [Parameter]
我需要Formula
和Parameter
之间的联接表,因为该关系包含名称、值等信息。
实体
class Formula
{
/**
* @ORMOneToMany(targetEntity="FormulaDefinitionParameter", mappedBy="formula", cascade={"all"}, orphanRemoval=true)
*/
private $parameters;
}
class FormulaParameter
{
/**
* @ORMManyToOne(targetEntity="Formula", cascade={"persist"})
* @ORMJoinColumn(referencedColumnName="id", nullable=false)
*/
private $formula;
/**
* @ORMManyToOne(targetEntity="Parameter")
* @ORMJoinColumn(referencedColumnName="id", nullable=false)
*/
private $parameterFormat;
/**
* @var string|null
* @ORMColumn(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 TAMASAstroBundleEntityFormula();
}
$form = $this->get('form.factory')->create(AppFormFormulaType::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 EFormulaParameter();
$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
为了实现通过Formula
Form Controller添加ParameterFormula
,我只需要向Formula
实体添加一个addParameter()
方法,如下所示:
/**
* Add parameter
* @param FormulaParameter $parameter
* @return Formula
*/
public function addParameter(FormulaParameter $parameter)
{
$this->parameters->add($parameter);
return $this;
}
然后在控制器内部使用此方法:
foreach ($params as $id => $param){
// CREATION OF THE FORMULA PARAMETER
$paramFormula = new EFormulaParameter();
$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);
}