多対多の関係 (シナリオとステップ) を持つ 2 つのエンティティがあります。シナリオ内のステップの順序を保存する必要があったため、displayOrder プロパティを持つ ScenarioToStep という 3 番目のエンティティを追加しました。
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 エンティティを更新したいと考えています。私は最初に次のようなものを試しました:
$scenario->getScenarioToStep()->clear();
foreach ($tabIds as $pos => $stepId) {
$sts = new ScenarioToStep();
$sts->setScenario($scenario)->setStep($step)->setOrder($pos);
$scenario->getScenarioToStep()->add($sts);
}
しかし、重複キーエラーが発生します
同様のことを行うが、新しいシナリオをインスタンス化する代わりに、エンティティ マネージャーに参照 (プロキシ) を要求すると、関連付けテーブルは常に空になります。
保存を実行する方法についてアイデアを持っている人に感謝します