ON DELETE CASCADE 与 Symfony 和 Doctrine 的多对多关系

2024-06-28

我想要与 Symfony 和 Doctrine 建立简单的多对多关系。这实际上是一个单向的一对多关联,可以通过连接表映射为文档表明 http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#one-to-many-unidirectional-with-join-table我使用 YAML 文件通过以下代码进行配置:

在文件 Content.orm.yml 中:

manyToMany:
  comments:
    cascade: ["persist","remove"]
    onDelete: CASCADE
    options:
      cascade:
        remove: true
        persist: true
        #refresh: true
        #merge: true
        #detach: true
    orphanRemoval: false
    orderBy: null
    targetEntity: Comment
    joinTable:
      name: content_comments
      joinColumns:
        content_id:
          referencedColumnName: id
      inverseJoinColumns:
        comment_id:
          referencedColumnName: id
          unique: true

这会产生以下 SQL 命令:

$ php app/console doctrine:schema:update --dump-sql | grep -i "comment\|content"
CREATE TABLE comment (id INT AUTO_INCREMENT NOT NULL, text LONGTEXT NOT NULL, content_id INT NOT NULL, creation_date DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE contents (id INT AUTO_INCREMENT NOT NULL, user INT DEFAULT NULL, user_id INT NOT NULL,file VARCHAR(255) DEFAULT NULL, INDEX IDX_B4FA11778D93D649 (user), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
CREATE TABLE content_comments (content_id INT NOT NULL, comment_id INT NOT NULL, INDEX IDX_D297CC584A0A3ED (content_id), UNIQUE INDEX UNIQ_D297CC5F8697D13 (comment_id), PRIMARY KEY(content_id, comment_id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
ALTER TABLE contents ADD CONSTRAINT FK_B4FA11778D93D649 FOREIGN KEY (user) REFERENCES users (id);
ALTER TABLE content_comments ADD CONSTRAINT FK_D297CC584A0A3ED FOREIGN KEY (content_id) REFERENCES contents (id);
ALTER TABLE content_comments ADD CONSTRAINT FK_D297CC5F8697D13 FOREIGN KEY (comment_id) REFERENCES comment (id);

但正如您所看到的,即使我尝试放置我找到的所有 YAML 注释,FOREIGN KEY 指令也没有“ON DELETE CASCADE”部分。

因为在代码中,我试图删除一个“内容”实体以及与此代码关联的所有“注释”:

        $comments = $content->getComments();

        // Remove first the parent
        $entity_manager->remove($content);
        $entity_manager->flush();

        // Remove the childs
        foreach($comments as $comment)
        {
            $entity_manager->remove($comment);
        }

        $entity_manager->flush();

这会产生以下异常。

An exception occurred while executing 'DELETE FROM comment WHERE id = ?' with params [1]:\n\nSQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`bb2server`.`content_comments`, CONSTRAINT `FK_D297CC5F8697D13` FOREIGN KEY (`comment_id`) REFERENCES `comment` (`id`))

那么,我做错了什么?或者如何强制 Doctrine 在多对多关系中放置“ON DELETE CASCADE”?

我唯一肮脏的解决方法是删除 SQL 查询并自行重建,但我需要 Doctrine 在 schema:update 中创建查询以避免我修补:

mysql> show create table content_comments;
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table            | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| content_comments | CREATE TABLE `content_comments` (
  `content_id` int(11) NOT NULL,
  `comment_id` int(11) NOT NULL,
  PRIMARY KEY (`content_id`,`comment_id`),
  UNIQUE KEY `UNIQ_D297CC5F8697D13` (`comment_id`),
  KEY `IDX_D297CC584A0A3ED` (`content_id`),
  CONSTRAINT `FK_D297CC584A0A3ED` FOREIGN KEY (`content_id`) REFERENCES `contents` (`id`),
  CONSTRAINT `FK_D297CC5F8697D13` FOREIGN KEY (`comment_id`) REFERENCES `comment` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> ALTER TABLE content_comments DROP FOREIGN KEY FK_D297CC5F8697D13;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE content_comments ADD CONSTRAINT FK_D297CC5F8697D13 FOREIGN KEY (`content_id`) REFERENCES `contents` (`id`) ON DELETE CASCADE;
Query OK, 10 rows affected (0.07 sec)
Records: 10  Duplicates: 0  Warnings: 0

编辑:解决方法。我需要将 onDelete: CASCADE 放在 JoinColumns 下

manyToMany:
  comments:
    cascade: ["persist","remove"]
    onDelete: CASCADE
    options:
      cascade:
        remove: true
        persist: true
        #refresh: true
        #merge: true
        #detach: true
    orphanRemoval: false
    orderBy: null
    targetEntity: Comment
    joinTable:
      name: content_comments
      joinColumns:
        content_id:
          referencedColumnName: id
          onDelete: CASCADE
      inverseJoinColumns:
        comment_id:
          referencedColumnName: id
          unique: true
          onDelete: CASCADE

您必须在“joinColumns”和“inverseJoinColumns”中添加“JoinColumn”定义,如下所示:

/**
 * @var Collection|null
 * @ManyToMany(targetEntity="...")
 * @JoinTable(name="...",
 *     joinColumns={@JoinColumn(name="`...`", referencedColumnName="id", onDelete="CASCADE")},
 *     inverseJoinColumns={@JoinColumn(name="`...`", referencedColumnName="id", onDelete="CASCADE")}
 * )
 */

您可以在那里添加 onDelete 级联(数据库级别)定义

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ON DELETE CASCADE 与 Symfony 和 Doctrine 的多对多关系 的相关文章

  • 获取symfony中复选框的值

    我想获取复选框的值 选中或未选中 但复选框未添加到表单类型中 这是一个例子
  • MySQL:删除包含特定参数且早于一天的行[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 mysql 为我的网站创建一个登录系统 它在基于订阅的系统上运行 如果参数 premium 等于 1 DAY 如果它早于一
  • 如果 Woocommerce 单一产品中的库存数量少于 10,请在库存数量旁边添加文本

    我发现这是作为另一个线程的评论发布的 但我不知道应该用它做什么 if product gt get stock quantity lt 10 echo Limited supply left 我想它应该有一个钩子 我试过woocommerc
  • 如何将这种奇怪的字符串解码为UTF-8? (PHP)

    所以我有 u041E u043B u0435 u0433 20 u042F u043A如何将其保存为真正的 UTF 8 或 对我来说更好的是 HTML 实体 这就是 JavaScriptescape 格式 它与 URL 编码类似 但不兼容
  • 恢复 woocommerce 订单

    最近 我的服务器团队更换了我的数据库 他们将我们以前的数据库放入其中 因此 我们丢失了某一天 特定日期 的订单详细信息 现在 服务器团队提供包含丢失当天订单详细信息的备份 现在请告诉我如何恢复这些订单 我无法用给定的备份替换我们的数据库 因
  • 如果用户禁用了 javascript,如何回退到完全不同的索引页面?

    我有一个大型 动态生成的单页网站 该网站严重依赖 javascript 我想为没有 javascript 的人提供后备 每个版本必须有不同的 php 代码 所以基本上我需要一个完全不同的索引页面 我不想将所有内容都包装在 javascrip
  • 对许多站点使用中央数据库服务器:合理吗?

    基本上 我需要在多达几十个站点上同步数据库数据的某些部分 完美的解决方案是创建一个中央服务器来托管该数据 每个页面加载都必须从两个数据库服务器 本地和远程数据库服务器 获取数据 并且写入远程服务器也很常见 虽然数据库服务器在硬件方面可以达到
  • SQL错误:0,SQLState:08S01通信链路故障[重复]

    这个问题在这里已经有答案了 我收到此错误 不那么频繁 2013 05 08 16 44 35 786 WARN JDBCExceptionReporter java 100 org hibernate util JDBCExceptionR
  • 查找定义类的 PHP 文件(在运行时)

    PHP 中是否有任何反射 内省 魔法可以让您找到定义特定类 或函数 的 PHP 文件 换句话说 我有一个 PHP 类的名称 或者一个实例化对象的名称 我想把这个传递给某物 函数 反射类等 将返回定义该类的文件系统路径 path to cla
  • 如何正确使用 Bearer 代币?

    我正在制作一个授权系统PHP 我遇到了传递 JWT 令牌的承载方案 我阅读了 RFC 6750 1 我有以下疑问 这如何提高安全性 成功授权和登录后 服务器在其主体中使用 JWT 令牌响应客户端 现在当客户端发出另一个请求时 我不清楚如何实
  • 在准备好的语句中使用“like”通配符

    我正在使用准备好的语句来执行 mysql 数据库查询 我想实现基于某种关键字的搜索功能 为此我需要使用LIKE关键字 我知道的就这么多 我以前也使用过准备好的语句 但我不知道如何使用它LIKE因为从下面的代码中我将在哪里添加 keyword
  • 无法从 localhost/xampp 发送邮件

    无法连接到 mail google com 端口 587 上的邮件服务器 请验证您的 SMTP 和 smtp port 设置php ini or use ini set 我将 xampp php ini 和 sendmail ini 文件配
  • 如何使用 DbSession 在 Yii2 中创建用户会话管理系统 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 今天 当我想为我的网站创建用户个人资料页面并希望创建系统用户可以管理他在此系统中的活动会话时 需要 查看活动会话 浏览器和平台 查看当
  • PHP Remedy API 调用创建带有附件的条目不起作用(使用 Postman Works!)

    当我尝试创建带有 PDF 附件的条目时 我已经为此工作了好几天 但没有成功 使用补救 REST API 我每次都会收到超时错误 500 或错误请求 这是文档 https docs bmc com docs ars2002 example o
  • PHP curl 获取标头参数

    我将curl 与PHP 结合使用来获取API 调用的标头响应 这是我的代码 curl curl init curl setopt curl CURLOPT URL http localapi com v1 users curl setopt
  • 尝试加载 php_oci8.dll 时 PHP 启动时出现警告

    我正在使用 XAMPP 并尝试为 sql 配置 Oracle 连接 我取消了该行的注释extension php oci8 dll一开始出现错误 缺少oci dll 但后来我从Oracle网页下载了instantclient 我尝试过版本
  • YouTube API 观看私人视频

    我有一个具有草稿模式的网站 有人可以登录并查看该网站的外观 以便在公众看到该网站之前批准该网站 我在一个帐户上有一些 YouTube 视频 但我将其设为私人帐户 因为我不想让全世界看到它们 不过 我确实希望登录草稿模式的人能够观看私人嵌入内
  • MySQL:进行基本搜索

    我的数据库中有一个名称表 我希望对其进行模糊搜索 例如我的数据库包含 Name ID John Smith 1 Edward Smith 2 Gabriel Gray 3 Paul Roberts 4 目前 当我通过 python 搜索数据
  • 在cakephp中调用函数

    public function data if old status prev lat lat prev long long if status Village Unknown exec query else if status Town
  • php 32位日期解析1901年12月13日之前的日期

    我很高兴使用strtotime http www php net manual en function strtotime php在我的开发机器上解析日期 其中一些日期是 1800 年代 一个极端的例子是 1500 年代 但我的开发机是64

随机推荐

  • YouTube API Android 自动启动

    我在我的应用程序中使用 YouTube API 我的问题是 视频不会自动播放 用户必须按播放按钮才能开始播放 My code setContentView R layout playerview demo YouTubePlayerView
  • jQuery 仅验证远程 onblur,但允许 onkeyup 休息 [重复]

    这个问题在这里已经有答案了 我正在尝试进行 jquery 远程验证以查看名称是否唯一 但我不想对每个 onkekup 事件进行远程验证 但是我想在模糊事件上执行此操作 当用户离开文本框时 但使用我下面的当前代码 它会在按下第二个字符后启动
  • OpenCV 和 QT 之间的集成

    我对 QT 和 OpenCV 开发完全是新手 一般来说是 C 我想使用 OpenCV 开发一个应用程序并使用 Qt 创建其界面 我不明白的是 如何整合这两个部分 我的意思是 为了开发 java 我只使用 eclipse 它为我提供了 JFr
  • Maven 构建成功,但没有在 Selenium 中执行测试

    编辑 我已将项目上传到 github 供任何想查看的人使用https github com hfunsh test automation git https github com hfunsh test automation git 我使用
  • 如何在 ASP.net core 中为自定义模型绑定器编写单元测试

    我已经为属性编写了自定义模型绑定器 现在我正在尝试编写相同的单元测试 但无法为模型绑定器创建对象 谁能帮我 下面是我必须编写测试的代码 public class JourneyTypesModelBinder IModelBinder pu
  • IIS Express - Visual Studio - 在同一端口上运行多个站点

    我有多个使用同一端口 8888 的 API 这些 API 是不同解决方案的一部分 http localhost 8888 api1 http localhost 8888 api1 http localhost 8888 api2 http
  • Matplotlib动画无法保存

    我正在尝试学习如何使用创建 matplotlib 动画Jake Vanderplas 的基本示例 http jakevdp github io blog 2012 08 18 matplotlib animation tutorial 但我
  • MSBuild 发布 dotnet 核心应用程序

    我的设置是 我有一个解决方案 其中包含不同的 dotnet4 6 应用程序 服务 现在我们在此解决方案中添加了一个 dotnet core 项目 我可以构建和调试它 但这不会创建可执行文件 在 Visual Studio 中 我可以右键单击
  • Java EE 异常:名称 java:comp 未在此上下文中绑定

    我在 Netbeans 7 2 1 中有 Java EE 应用程序 尝试部署它 构建结束正常 我在 Tomcat 日志中收到错误 Caused by javax naming NameNotFoundException Name java
  • 在 C# 中解析 Json Rest api 响应[重复]

    这个问题在这里已经有答案了 我正在尝试使用 C 从 Rest api json 响应中提取值 我有以下代码 client BaseUrl https api cloud appcelerator com request Resource v
  • 在我的表单 Symfony2 中创建重复字段

    我正在开展一个大学项目 我想让所有学生都参加 我创建了一个包含 3 个字段的模型 即日期 当前 布尔值 和学生 ID 现在 当我尝试从中生成表单时 它只会显示这 3 个字段 但是我想要班上所有的学生 因此 我为学生创建了一个循环 并创建了一
  • 存储聊天消息和文件的最佳方式

    我想知道您对将聊天消息存储在数据库中有何看法 我需要能够将其他内容绑定到它们 例如文件或联系人 并且使用数据库是我目前看到的最佳方法 文件也有同样的问题 因为它们可以绑定到聊天消息 我也必须将它们存储在数据库中 对于数千条消息和文件 我想知
  • Meteor:RangeError:超出最大调用堆栈大小

    我收到以下错误 W20141210 18 14 54 394 5 5 STDERR W20141210 18 14 54 395 5 5 STDERR Users removed meteor packages meteor tool 1
  • 如何构建 FFMPEG 并将其链接到 iOS?

    all 我知道 这里有很多关于 iOS 上的 FFMPEG 的问题 但没有一个答案适合我的情况 当我尝试在项目中链接 FFMPEG 时 每种情况都会发生一些奇怪的情况 所以请帮助我 我的任务是为 iOS 编写视频聊天应用程序 该应用程序使用
  • 如何在 Codeigniter 3 中上传时显示不允许的文件类型错误消息?

    我正在做一个基本的工作博客应用程序 https github com Ajax30 lightblog with 代码点火器 3 1 8 and 引导程序4 当然 这些帖子有主要图片 有一个默认图像如果用户没有上传图像 但是如果有图像is已
  • strsplit 与 gregexpr 不一致

    一条评论 https stackoverflow com questions 23961022 split strings on first and last commas 23964843 noredirect 1 comment3692
  • 从业务逻辑类重定向 asp.net mvc 页面

    我在业务逻辑层中调用一个静态方法 出于我在这里不会提及的目的 该方法需要自行进行重定向 而不是将信息返回到控制器以进行重定向 我认为我需要使用 HttpContext 对象 但正在努力创建路由 我不能简单地执行 context Respon
  • 如何在 Tooltipster 工具提示中显示来自 jQuery Validate 插件的消息?

    我想使用工具提示插件 http calebjacob com tooltipster 显示由jQuery 验证插件 http docs jquery com Plugins Validation jQuery 验证插件 document r
  • 导出资源后偶尔出现空白帧 - AVExportSession

    这个问题有几个答案 但是我的情况有点不同 没有一个答案可以解决我的问题 客观的 我正在尝试添加一个慢动作ramp None
  • ON DELETE CASCADE 与 Symfony 和 Doctrine 的多对多关系

    我想要与 Symfony 和 Doctrine 建立简单的多对多关系 这实际上是一个单向的一对多关联 可以通过连接表映射为文档表明 http doctrine orm readthedocs org en latest reference