首页 > 解决方案 > 级联上的“Upsert”多对多关系持续存在

问题描述

假设我们在 Symfony 应用程序中有以下 3 个 Doctrine 实体:

class Questionnaire {
  /**
   * @ORM\OneToMany(targetEntity=Question::class, mappedBy="questionnaire", cascade={"persist"})
   */
  private $questions;
}

class Question {
  /**
   * @ORM\ManyToOne(targetEntity=Questionnaire::class, inversedBy="questions")
   * @ORM\JoinColumn(nullable=false)
   */
  private $questionnaire;

  /**
   * @ORM\ManyToMany(targetEntity=Choice::class, cascade={"persist"})
   */
  private $choices;
}

class Choice {
  /**
   * @ORM\Column(type="string", length=255)
   */
  private $name;
}

因此,要通过 API 请求创建调查问卷,我们需要 POST 这个 JSON :

{
    "questions": [
        {
            "title": "Question 1",
            "choices": [
                {
                    "name": "Choice 1"
                },
                {
                    "name": "Choice 2"
                },
                {
                    "name": "Choice 3"
                }
            ]
        },
        {
            "title": "Question 2",
            "choices": [
                {
                    "name": "Choice 1"
                },
                {
                    "name": "Choice 2"
                },
                {
                    "name": "Choice 3"
                },
                {
                    "name": "Choice 4"
                },
            ]
        }
    ]
}

但是,默认情况下,使用 Doctrine,此操作将导致选择question_choice表包含重复项,如下所示:

选择

ID 姓名
1 选择 1
2 选择 2
3 选择 3
4 选择 1
5 选择 2
6 选择 3
7 选择 4

问题选择

question_id 选择ID
1 1
1 2
1 3
2 4
2 5
2 6
2 7

我们怎样才能使它的结果如下?

选择

ID 姓名
1 选择 1
2 选择 2
3 选择 3
4 选择 4

问题选择

question_id 选择ID
1 1
1 2
1 3
2 1
2 2
2 3
2 4

标签: symfonydoctrine-ormdoctrine

解决方案


推荐阅读