symfony - 级联上的“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 |
解决方案
推荐阅读
- c# - 有条件的 Blazor 路由
- python - Pyarmor 打包多个文件
- reactjs - 状态更改时如何在 Button 中更改禁用 React
- javascript - 如何使用 css 将它们居中,以便即使在调整窗口大小时它们也保持一致?
- javascript - Webpack 5.47.1:配置对象无效。Webpack 已使用与 API 架构不匹配的配置对象进行初始化
- node.js - 即使 Expressjs 中存在错误处理程序,AWS 也会显示它自己的错误屏幕
- apache-flink - Flink 1.13 中时态表的文档在哪里?
- angular - Ngrx 存储值未显示在组件模板中
- java - 如何在 Java 中返回 3x6 矩阵的所有可能结果?
- qt - QT 或 QML:在移动应用程序中捕获应用程序关闭事件