更新和删除 CakePHP 中的唯一连接关系

2024-01-07

编辑:我需要帮助的是删除 topic_posts 表中主题和帖子之间的所有关系,以便清理关系并删除旧关系。然后代码的其余部分应该可以正常工作,因为所有问题都将得到解决,因为我们在添加关系之前删除了它们。

在我的 CakePHP 应用程序中,我有帖子和主题(主题是唯一的并且有一个 id),它们通过 Topic_Posts 相互链接,该主题处理帖子和主题之间的关系。

但是,如果用户编辑具有关系的帖子并保存它,那么它不仅仅是修改关系,而是将它们复制到 Topic_posts 表中,并且如果用户从帖子中删除主题,也不会删除它们!

处理这个问题的最佳方法是什么?我听说过删除该帖子的所有关系,然后重新添加它们是处理上述场景的最干净、最好的方法,但我又该怎么做呢?

这是处理主题保存的代码(它确实检查主题是否不重复),但不检查它们是否是重复的关系,也不删除关系。

public function savePostTopics($postId, $topics)
    {
        // Explode the topics by comma, so we have an array to run through
        $topics = explode(',', $topics);
        // Array for collecting all the data
        $collection = array();

        foreach($topics as $topic)
        {
            // Trim it so remove unwanted white spaces in the beginning and the end.
            $topic = trim($topic);

            // Make it all lowercase for consistency of tag names
            $topic = strtolower($topic);

            // Check if we already have a topic like this
            $controlFind = $this->find(
                'first',
                array(
                    'conditions' => array(
                        'title' => $topic
                    ),
                    'recursive' => -1
                )
            );

            // No record found
            if(!$controlFind)
            {
                $this->create();
                if(
                    !$this->save(
                        array(
                            'title' => $topic
                        )
                    )
                )
                {
                    // If only one saving fails we stop the whole loop and method.
                    return false;
                }
                else
                {
                    $temp = array(
                        'TopicPost' => array(
                            'topic_id' => $this->id,
                            'post_id' => $postId
                        )
                    );
                }
            }
            else
            {
                $temp = array(
                    'TopicPost' => array(
                        'topic_id' => $controlFind['Topic']['id'],
                        'post_id' => $postId
                    )
                );
            }

            $collection[] = $temp;
        }

        return $this->TopicPost->saveMany($collection, array('validate' => false));
    } 

以下是协会:

Post.php
class Post extends AppModel
{
    public $name = 'Post';

    public $belongsTo = 'User';

    public $hasMany = array('Answer');

    // Has many topics that belong to topic post join table... jazz
    public $hasAndBelongsToMany = array(
        'Topic' => array('with' => 'TopicPost')
    );
}

Topic.php
class Topic extends AppModel
{
    public $hasMany = array(
        'TopicPost'
    );
}

TopicPost.php
class TopicPost extends AppModel {
    public $belongsTo = array(
        'Topic', 'Post'
    );
}

编辑:我已执行以下操作以使两列彼此唯一:

`id` int(11) unsigned NOT NULL auto_increment,
  `topic_id` int(11) NOT NULL,
  `post_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `unique_row` (`topic_id`,`post_id`)

但是当我进行更新时,我收到一个 SQL 错误,所以基本上 Cake 没有正确处理这个问题...我该如何解决这个问题,因为它只能通过防止数据重复来部分解决问题!另外,在删除主题时如何处理,因为我希望从 topic_posts 中删除关系,但不知道该怎么做?

Database Error
Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2-107' for key 2

SQL Query: INSERT INTO `db52704_favorr`.`topic_posts` (`topic_id`, `post_id`) VALUES (2, 107)

首先你不需要该列id在主题_帖子中。您应该删除它并改为使用:

  `topic_id` int(11) NOT NULL,
  `post_id` int(11) NOT NULL,
  PRIMARY KEY  (`topic_id`, `post_id`)

这意味着添加到帖子中的每个主题只能添加一次(这实际上就是您现在所拥有的,只是更加整洁)。

更新帖子时出现 SQL 错误的原因是,您将每个主题添加到 Topic_Posts 中的帖子中,无论它们之前是否存在。

你的代码片段说:

  • For each topic the user has added to the post, do this:
    • 如果主题不存在,则将其添加到 Topic 表中(看起来您忘记将其添加到此处的 Topic_Posts 表中)
    • 如果主题确实存在,请将其添加到 Topic_Posts 表中(不检查它是否已存在)

相反,你希望它说这样的话:

  • For each topic the user has added to the post, do this:
    • 如果主题不存在,则将其添加到Topic表中,然后将其添加到Topic_Posts表中(由于它是Topic_Posts中的外键,因此必须先在Topic表中创建它)
    • 如果该主题确实存在...
    • 如果 Topic_Posts 表中不存在该帖子,请添加它,否则忽略它

处理主题删除的另一种方法可能是:

  • 从 Topic_Posts 中删除当前帖子的所有行
  • For each topic the user has added to the post, do this:
    • 如果主题不存在,则将其添加到Topic表中,然后将其添加到Topic_Posts表中(由于它是Topic_Posts中的外键,因此必须先在Topic表中创建它)
    • 如果主题存在,则将其添加到Topic_Posts表中

您无需担心以这种方式检查 Topic_Posts 中该帖子是否存在主题,因为第一步是删除该帖子的所有主题。

希望有帮助。

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

更新和删除 CakePHP 中的唯一连接关系 的相关文章

  • 检查 PHP 中“@”字符后面的单词

    我现在正在制作一个新闻和评论系统 但是我已经在一个部分上停留了一段时间了 我希望用户能够在 Twitter 上引用其他玩家的风格 例如 用户名 该脚本看起来像这样 不是真正的 PHP 只是想象脚本 3 string I loved the
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • Symfony2 Assetic 和 Less Sourcemaps

    我不确定如何破解 assetic less 过滤器以输出源映射文件 我这里指的是LessFilterhttps github com kriswallsmith assetic blob master src Assetic Filter
  • preg_match_all 查询仅显示有问题的外部组

    我无法弄清楚如何只显示 preg 查询的外部组级别 我会给你一个例子 preg match all start end input matches 这个输入start1 start2 2end 1end产生这个输出start1 start2
  • 为什么 iconv 在 php:7.4-fpm-alpine docker 中返回空字符串

    给出以下代码
  • PHP 在输入流中使用 fwrite 和 fread

    我正在寻找将 PHP 输入流的内容写入磁盘的最有效方法 而不使用授予 PHP 脚本的大量内存 例如 如果可以上传的最大文件大小为 1 GB 但 PHP 只有 32 MB 内存 define MAX FILE LEN 1073741824 1
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • PHP preg_filter 返回意外的长值

    尝试在 Woocommerce 中删除标签并过滤值 但无法以正确的格式获取它 有东西有腥味 我正在使用WC gt cart gt get cart subtotal 来检索该值 在此示例中 我的值是 2 429kr 原始返回值是 span
  • 覆盖控制器 Symfony 3.4/4.0

    我目前正在尝试覆盖 FOSUserBundle 中的控制器 在新的文档中 https symfony com doc 3 4 bundles override html https symfony com doc 3 4 bundles o
  • Woocommerce 结账自定义选择字段

    我有以下功能 将选择列表添加到 woo commerce 结账表单中 woocommerce form field airport pickup array type gt select class gt array airport pic
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • 如果循环中内存超出,我可以在 for 循环中抛出异常吗?

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何处理 foreach 循环中发生
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • php 错误 fopen(): 文件名不能为空

    发送带有附件代码的电子邮件工作正常 最近我们已将文件传输到另一个托管服务器 idk 发生了什么 它显示以下错误 警告 fopen 第 106 行 home hugerecruitmetnt public html validatecva p
  • php,统计字符并删除超过140个字符的内容

    我需要一个 PHP 函数来计算短语的字符数 如果短语长度超过 140 个字符 则此函数应删除所有其他字符并在短语末尾添加三个点 例如我们有 message I am what I am and you are what you are et
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array

随机推荐

  • 在 Bigquery 中参数化数据类型的目的是什么?

    在 BigQuery 中 您可以参数化某些数据类型 参考 https cloud google com bigquery docs reference standard sql data types parameterized data t
  • 在 WebKit.NET 上获取 HTTP 标头

    我一直在尝试弄清楚如何处理 401 响应WebKit NET并显示一个身份验证框 以便用户可以输入他的凭据 然后将其发送回服务器 This guy https github com therealmitchconnors webkitdot
  • SVG 中的路径放置在 D3 图表中圆圈的前面,无论附加顺序如何

    我的数据线应该放在behind但顽固地拒绝这样做 首先 我认为这与附加的顺序有关 但显然 事实并非如此 我了解到others https stackoverflow com questions 29282120 how can i get
  • 在 IIS 7 中运行 MVC3 应用程序时出现问题

    我在运行 Windows 7 Home 64 位的计算机上在 IIS7 中运行 MVC 3 项目时遇到问题 这就是我所做的 安装了 IIS 7 访问服务器并得到IIS欢迎页面 创建一个名为 d MySite 的目录并将 MVC 应用程序复制
  • 使用 Rails 4 Activerecord 将多个列计数合并到单个查询中

    Rails 4 1 Postgres 9 3 部署到 Heroku 我正在尝试减少对数据库的调用次数 我有一个大表 调查 有多个布尔列 例如role composer role performer 等等 控制器有多个查询 例如 sample
  • 如何在React JS中保留浏览器后退按钮上应用的过滤器

    在我的应用程序中 所有列表页面上都有过滤器 现在根据要求 我想在浏览器后退按钮上保留应用的过滤器 例如 假设用户已在销售列表页面上应用了过滤器 之后 他点击一条记录进入销售编辑页面 现在 如果用户点击浏览器后退按钮 那么那些应用的过滤器应该
  • 如何使用多字符分隔符分割字符串并维护分隔符

    使用 VB NET 我有一个字符串 RES00012 Some value RES00034 Another value 我想用 RES 作为分隔符 RES00012 Some value and RES00034 Another valu
  • Visual Studio 不要打开新的浏览器实例

    当我尝试在 Windows 10 上的 Visual Studio 2017RC 中运行 Web 应用程序时 它会打开一个新的浏览器实例 在我的例子中是 chrome 我也尝试过使用 Internet Explorer 情况相同 并且浏览器
  • xmpp 中的带内注册是什么?

    很抱歉不得不问 但我不知道这个术语的含义 也找不到简单的定义 我想知道我是否需要启用此功能 以便用户使用我正在编写的 iphone 客户端在我的 openfire 服务器上注册一个全新的帐户 Thanks 带内注册意味着在您的服务器上没有帐
  • DEVELOPER_TOKEN_NOT_APPROVED AdWords

    美好的一天 伙计们 我正在开发一个项目 需要设置 Google Adwords 帐户才能使用 API 我正在使用 Python 客户端库 当我运行测试应用程序时 出现 DEVELOPER TOKEN NOT APPROVED 错误 经过对这
  • 如何在 androidTest 上正确模拟 ViewModel

    我目前正在为片段编写一些 UI 单元测试 其中之一 Test就是看一个对象列表是否正确显示 这是不是整合测试 因此我希望mock the ViewModel 片段的变量 class FavoritesFragment Fragment pr
  • 如何检测假用户(爬虫)和cURL

    其他一些网站使用 cURL 和虚假 http 引用来复制我的网站内容 我们有什么方法可以检测 cURL 或不是真正的网络浏览器吗 没有什么神奇的解决方案可以避免自动抓取 人类能做的一切 机器人也能做 只有一些解决方案会让这项工作变得更加困难
  • JIRA:查找与用户相关的所有问题

    在 JIRA 中 如何查找所有项目中与用户相关的所有问题 简单的查询搜索仅产生全文结果 即 仅涉及名称被提及的问题 而不是名称已被分配 已报告 已抄送等的问题 我在这里的目的是寻找与我相关的股票会计票据 我使用的是 JIRA 3 13 as
  • ExtJS 6 按关联模型进行网格组

    Context 不久前我用过这个answer https stackoverflow com a 19198773 1842261实现远程排序和过滤 使用 关联模型 关联模型字段 格式 我可以轻松解析服务器端代码中的表达式以查询数据库 Pr
  • 如何使用 JavaScript 清除/重置 formData()?

    我正在使用formData进行Ajax图像上传 当我第一次提交时它将成功上传 并再次单击发布按钮该图像也发布到服务器 我认为formData不会清除 My Code postsubmitimage click function var fo
  • jQuery UI 自动完成 DownArrow UpArrow

    我在 jQuery 自动完成和移动向下箭头和向上箭头方面遇到一些问题 问题似乎在于
  • MySQL:多类别产品的 SQL 和 DB

    我正在开发一个现在拥有数百万条记录的网站 抱歉 无法透露哪个网站 最初它只有几百条记录 因此下面的查询是可以接受的 查询 SELECT FROM WHERE 类别 LIKE 3 但现在它只是杀死数据库 因为对于每个查询 它都必须使用上述查询
  • WSO2 身份服务器 JWT 访问令牌

    当使用密码 grant type 登录时 我尝试从 WSO2 Identity Server 接收 JWT access token 但我找不到任何方法来配置它 当我登录时 我得到一个 guid 作为 access token 我发现了这个
  • 如何使我的自定义配置部分表现得像一个集合?

    我需要如何编写我的自定义ConfigurationSection这样它既是一个节处理程序又是一个配置元素集合 通常 你有一个类继承自ConfigurationSection 然后它有一个继承自的类型的属性ConfigurationEleme
  • 更新和删除 CakePHP 中的唯一连接关系

    编辑 我需要帮助的是删除 topic posts 表中主题和帖子之间的所有关系 以便清理关系并删除旧关系 然后代码的其余部分应该可以正常工作 因为所有问题都将得到解决 因为我们在添加关系之前删除了它们 在我的 CakePHP 应用程序中 我