我有两个具有多对多关系的实体(场景和步骤)。我需要保存场景中步骤的顺序,因此我添加了第三个实体,名为 ScenarioToStep,并带有 displayOrder 属性。
class ScenarioToStep
{
/**
* @ORM\Id
*
* @ORM\ManyToOne(targetEntity="Hakisa\Bundle\GettingStartedBundle\Entity\Scenario", inversedBy="scenarioToStep")
* @ORM\JoinColumn(name="scenario_id", referencedColumnName="id")
*
* @var Hakisa\Bundle\GettingStartedBundle\Entity\Scenario
*/
private $scenario;
/**
* @ORM\Id
*
* @ORM\ManyToOne(targetEntity="Hakisa\Bundle\GettingStartedBundle\Entity\Step", inversedBy="stepToScenario")
* @ORM\JoinColumn(name="step_id", referencedColumnName="id")
*
* @var Hakisa\Bundle\GettingStartedBundle\Entity\Step
*/
private $step;
/**
* Order of the step in the scenario
*
* @ORM\Id
*
* @ORM\Column(type="integer")
*
* @var integer
*/
private $displayOrder;
3 个属性构成主键,因此我可以在一个场景中多次执行步骤
我有一个 UI,我可以在其中通过拖放添加步骤、删除步骤或排序步骤。此 UI 向 PHP 发送一个数组,其中索引是位置,值是步骤的 id。
array(
0 => 1,
1 => 2,
2 => 3,
3 => 1,
4 => 4
)
我想更新我的场景实体以匹配这个新的排序。我首先尝试了类似的东西:
$scenario->getScenarioToStep()->clear();
foreach ($tabIds as $pos => $stepId) {
$sts = new ScenarioToStep();
$sts->setScenario($scenario)->setStep($step)->setOrder($pos);
$scenario->getScenarioToStep()->add($sts);
}
但我最终会出现重复的键错误
如果我做类似的事情,但不是实例化一个新场景,而是向实体管理器询问参考(代理),那么关联表总是空的
感谢任何对我应该如何执行保存有想法的人