Doctrine orm 更新关联

Doctrine orm 更新关联,doctrine-orm,Doctrine Orm,我有两个具有多对多关系的实体(场景和步骤)。我需要在场景中保存步骤的顺序,所以我添加了第三个名为ScenarioToStep的实体,并带有displayOrder属性 class ScenarioToStep { /** * @ORM\Id * * @ORM\ManyToOne(targetEntity="Hakisa\Bundle\GettingStartedBundle\Entity\Scenario", inversedBy="scenarioToStep") * @ORM\Joi

我有两个具有多对多关系的实体(场景和步骤)。我需要在场景中保存步骤的顺序,所以我添加了第三个名为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);
}
但我最终会出现重复的键错误

如果我做了类似的事情,但没有实例化一个新场景,而是向EntityManager请求引用(代理),那么关联表总是空的

感谢所有对我应该如何执行保存有想法的人