CakePHP:创建新的 HABTM 行而不是更新其他行

2024-01-28

我有两个具有 HABTM(具有且属于多个)关系的模型:Qsets 和 Questions。

以下操作(在 QsetsController.php 中)应该会在 qsets_questions 表中产生一个新行,新问题出现在新的 qset 中。但相反它updates现有的行,导致该问题开始从先前的 qset 中获取并添加到新的 qset 中。

我究竟做错了什么?

public function admin_add_question( $qset_id, $question_id) {

    //find the qset...
    $qset = $this->Qset->find('first', array('id'=>$qset_id));

    $this->Qset->QsetsQuestion->create();
    $data = array(
            "Qset"=> array ("id"=>$qset_id),
            "Question"=>array ("id"=>$question_id)
    );
    Controller::loadModel('Question');
    $r= $this->Question->save($data);

    $this->Session->setFlash('Question id['.$question_id.'] added.');

    $this->redirect( $this->referer() );
}

如果我的描述不清楚,会发生以下情况:

在添加问题之前...

**Qset 1**
Question 1
Question 2

**Qset 2**
Question 3
Question 4

What should将问题 2 添加到 Qset 2 时发生

**Qset 1**
Question 1
Question 2

**Qset 2**
Question 3
Question 4
Question 2

相反会发生什么...

**Qset 1**
Question 1
          <----removed
**Qset 2**
Question 3
Question 4
Question 2

update: 这是我的 qsets_questions 表的转储:

CREATE TABLE `qsets_questions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `question_id` int(11) NOT NULL,
  `qset_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=64 ;

解决方案:

这是工作版本,感谢@nuns

public function admin_add_question( $qset_id, $question_id) {

    $this->Qset->QsetsQuestion->create();
    $data = array(
            "qset_id"=>$qset_id,
            "question_id"=>$question_id
    );
    Controller::loadModel('Question');
    $this->Question->QsetsQuestion->save($data);
    $this->Session->setFlash('Question id['.$question_id.'] added.');       
    $this->redirect( $this->referer() );
}

好的,这就是我的think正在发生:

你没有使用超级有用的 HABTM 关系魔法。 Cake 不将该表视为单纯的关系表,而是转到定义的模型并查看您定义的关系以及primaryKeys 和displayFields 等。

当您有一个复杂的 HABTM 表时,这没问题。但如果是这样的话,你的数据数组就乱了,因为你没有添加Question and Qset分别地。我的意思是,你没有做

$data = array('Question'=>array('title'=>'new_question'),
              'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);

这样做,你让 cake 为你解析 HABTM 关联,​​并且该数据结构就可以了。但是您的模型文件夹中有自己的 QsetsQuestion 模型。所以你保存的数据应该像任何其他表一样,就像这样

$data = array('qset_id'=> $qset_id,
              'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);

这会在 qsets_questions 表中创建一个新的 id,并具有新的关系,就像您想要的那样。

不过要小心,因为你使用自己的模型,如果你没有正确设置验证,你可能会多次拥有同一对外键,因为默认情况下 cake 只是检查 id 必须是唯一的。

[EDIT]经过一番澄清后,上面的解决方案确实解决了“问题”,但实际上并不是这种行为的原因。

Cakephp 有一个feature http://book.cakephp.org/2.0/en/models/saving-your-data.html#what-to-do-when-habtm-becomes-complicated

默认情况下,当保存 HasAndBelongsToMany 关系时,Cake 会 在保存新行之前删除连接表上的所有行。例如 如果您的俱乐部有 10 名相关儿童。然后你更新 俱乐部有 2 个孩子。俱乐部只有 2 名儿童,而不是 12 名。

因此,当您想要添加新行时,cake 会删除所有先前的关联并添加新的关联。解决这个问题的一个方法是找到所有Qsets属于一个问题并将它们添加到$data数组(添加您要添加​​的新问题关联)。这个链接 http://rottmann.net/2012/07/cakephp-hasandbelongstomany-relationship-queries-demystified/帮助我了解 HABTM 关联(查找“挑战 IV”)。

我知道我之前给出的解决方案可以帮助您解决“问题”,但它是在您有这样的印象的情况下做出的QsetsQuestion模型文件某处。既然你不这样做,解决方案就是获取所有Questions关联并将它们添加为新数组。Or实际上创建一个QsetsQuestion模型,并进行如下关联:

Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.

或者改变蛋糕的行为......我知道它们看起来都不漂亮。

因此,解决方案总结:

  • 每次要保存新的Qset-Question关联时,检索以前存储的关联,将其放入要保存的数组中,然后保存

    //find previously associated Qsets, lets say it's 1,2,3 and 4
    $data = array('Question'=>array('id'=>1),
              'Qsets'=>array('Qsets'=>array(1,2,3,4, $new_qset));
    $this->Question-save($data);
    

注意没有QsetsQuestion,因为它不存在。这应该是第一个选项,因为 HABTM 模型并不复杂

OR

  • Create QsetsQuestion在您的模型文件夹中并更改如上所述的关联。控制器上的保存部分是

    $data = array('qset_id'=>1, 'question_id'=>1)
    $this->Question->QsetsQuestion->save($data);    //also works with $this->Qset->QsetsQuestion
    

它要简单得多(也许),但是您必须创建一个新文件,并记住检查以前是否没有类似的关联(在插入之前检查 2-2 元组是否存在)。简单的验证规则应该有效。

OR

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

CakePHP:创建新的 HABTM 行而不是更新其他行 的相关文章

  • 包含包含文件的 php 文件

    这是目录结构 global php includes class bootstrap php includes init php plugins myplugin php 这是这些文件中的代码 start php require inclu
  • 如何在 WordPress 中按类别获取所有帖子

    我想在 WordPress 中按类别获取帖子 args array post type gt project postslist get posts args 0 gt WP Post 对象 ID gt 421 post author gt
  • 在一个后台为MYSQL的网站上集成搜索

    我有一个位置搜索website http www jammulinks com对于一个城市 我们首先收集该城市所有可能类别的数据 如学校 学院 百货商店等 并将其信息存储在单独的表中 因为每个条目除了名称 地址和电话号码外都有不同的详细信息
  • 如何将行变成列?

    我有一个数据库 其中存储分组到项目中的关键字以及与每个关键字相关的数据 然后我显示每个项目的数据网格 每个关键字一行和几列 全部从同一个表 数据 中检索 我有 4 个表 关键字 项目 group keywords 和数据 keywords
  • 在 Laravel 中动态设置数据库连接和语言

    我有 3 个域指向同一个Laravel应用 我想要的是每个人都连接到自己的数据库并根据 TLD 加载自己的语言文件 我可以在哪个文件中设置这些设置 我可以直接在配置文件中执行此操作 或者可以在加载配置之前执行某些事件 我拥有的是一个简短的函
  • 尝试获取 Google accessToken

    看起来 无论我做什么 谷歌都在竭尽全力阻止我完成这个研究项目 我的项目让我使用 Google 电子表格作为数据库 并使用所述电子表格中的数据执行程序化的 Google 图片搜索 并向最终用户显示一些结果 设置说明 我开始按照此处的说明进行操
  • 如何将 MySQL 查询输出保存到 Excel 或 .txt 文件? [复制]

    这个问题在这里已经有答案了 如何将 MySQL 查询的输出保存到 MS Excel 工作表 即使只能将数据存储在 txt文件 就可以了 From 将 MySQL 查询结果保存到文本或 CSV 文件中 http www tech recipe
  • 删除 woocommerce 店面主页标题 php

    我正在使用 woocommerce 的店面主题 我需要用 php 删除主页标题 h1 我知道 css 解决方案 但我不想使用它 因为我想将 h1 添加到该页面的其他位置 并且在一个页面中包含 2 个 h1 对 seo 不利页 我也知道删除页
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 在 null laravel 上调用成员函数 save()

    大家好 我正在使用 laravel 5 多态关系将数据保存在数据库中 但我遇到了一些问题 当我尝试将数据保存在数据库中时 它会抛出此错误 对 null 调用成员函数 save 我不知道为什么我会遇到这个错误 我正在关注多态关系的本教程在 L
  • 如何在 Smarty 中打印 json

    我从 api 获取 json 如何使用 Smarty 打印 json Json格式 first name jinu last name mk loginid email protected cdn cgi l email protectio
  • 如何在 Twitter Card 中传递动态图像路径?

    我在用
  • 猪的组连接等效吗?

    试图在 Pig 上完成这个任务 寻找 MySQL 的 group concat 等效项 例如 在我的表中 我有以下内容 3fields userid clickcount pagenumber 155 2 12 155 3 133 155
  • 如何解决 Laravel 8 UI 分页问题?

    我在尝试最近发布的 laravel 8 时遇到了问题 我试图找出变化是什么以及它是如何工作的 当我这样做时 我遇到了分页 laravel 8 UI 变得混乱的问题 不知何故它发生了 有人可以帮助我吗 或者经历过同样的事情 像这样我在 lar
  • phpinfo 说 php.ini 路径是 C:\Windows 但那里没有 php.ini

    我们正在尝试从 PHP5 切换到 PHP7 现在我们已经安装了 Apache 并且 PHP 可以运行了 然而 我们在php ini文件没有任何作用 Via phpinfo 我们意识到原因是Configuration File php ini
  • 日期时间与时间戳字段

    我是 MySQL 数据库的新手 您是否建议在表创建中使用日期时间或时间戳字段以及原因 我正在使用 MySQL 5 7 和 innodb 引擎 Thanks 我会用TIMESTAMP对于任何需要自动管理的事情 因为它支持诸如ON UPDATE
  • 监听文件夹和文件(更改)

    可以直接在 PHP 或 Node 上监听文件夹和文件的更改 通过事件 还是我需要创建自己的方法来执行此操作 Example 我需要听文件夹 user 如果我将一些文件添加到该目录中 PHP 或 Node 会收到信息并运行PathEvent
  • PHP 中的多个插入查询[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个 php html 表单 它将结果插入到狗展数据库中 问题是 无论我做什么 我都会收到此错误 查询失败 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 INSE
  • 获取mysql中逗号分隔行中不同值的计数

    一个表 Jobs 有 2 列 JobId 城市 当我们保存工作时 工作位置可能是多个城市 如下所示 JobId City 1 New York 2 New York Ohio Virginia 3 New York Virginia 我如何
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

    我的表结构 table marks 我的目标 我想用条件插入或更新多条记录 我目前正在通过此查询进行检查 第一步 SELECT FROM marks WHERE student 115 AND param 1 第二步 if records

随机推荐

  • Singleton httpclient 与创建新的 httpclient 请求

    我正在尝试使用 HttpClient 在我的网络服务中创建层Xamarin Forms移动应用 没有单例模式 具有单例模式 in first方法我在每个新请求中创建新的http客户端对象 通过移动应用程序 这是我的代码 public Htt
  • macOS 11 Big Sur 中具有自定义视图的 NSMenuItem

    macOS 11 Big Sur 当前版本 beta 1 到 beta 6 有一个错误 功能 使得 NSMenuItem 难以使用自定义视图 具体来说 当菜单项突出显示时 项目的自定义视图不会调用draw dirtyRect 我通过 NSM
  • 读取并绑定多个 csv 文件

    我有一系列 csv 文件 每个文件一个 具有相同的列标题和不同的行数 最初我是这样读入并合并它们的 setwd lt N Ring data by cruise Shetland LengthHeight2013 lt read csv N
  • jsp中的“页面范围”是什么?

    有以下范围JSP 页面范围 请求范围 会话范围 适用范围 我对页面范围感到困惑 谁能告诉我这是什么页面范围 我在任何地方都没有找到它的明确定义 page范围意味着 它可以被认为是代表整个JSP页面的对象 即JSP 对象只能从创建它的同一页面
  • 在 Eclipse 中添加库 v7 AppCompat 时如何解决错误“未找到与给定名称匹配的资源”?

    我的项目目标是 API 级别 10 我想实现新的 ActionBar 支持库 按照中的所有说明进行操作后支持库设置 http developer android com tools support library setup html 当将
  • file.choose() 在 Windows 上打开没有文件名的对话框

    当我使用file choose or choose files选择文件时 对话窗口会显示文件夹图标 但不显示文本 以前没有出现过这个问题 我不久前更新了 RStudio 但我不确定这是否是原因 我目前使用 R 4 1 1 和 RStudio
  • CertPathValidatorException:找不到证书路径的信任锚 - Retrofit Android

    我正在创建一个 Android 应用程序 它使用https用于与服务器通信 我在用retrofit and OkHttp用于提出请求 这些对于标准来说效果很好http要求 以下是我遵循的步骤 Step 1 使用命令从服务器获取证书文件 ec
  • 计算彩色图像的 HSV 直方图与 H-S 直方图有何不同?

    我想计算图像的 HSV 直方图 我搜索了很多 但没有发现任何有用的东西 在opencv在线指南中我找到了H S直方图 V 对光照有什么影响 HSV 和 H S 是否相同 意味着 V 对光照没有影响 这是H S直方图的代码 cvtColor
  • 将简单的 Antlr 语法转换为 Xtext

    我想将一个非常简单的Antlr语法转换为Xtext 所以没有句法谓词 https stackoverflow com questions 5728659 translate antlr grammar into xtext grammar
  • mathematica 如何确定在替换中首先使用哪个规则

    我想知道如果给定多个替换规则 mma 如何确定在发生碰撞时首先应用哪个规则 一个例子是 x 3 x 2 s x 3 s 2 s x x gt 0 x OddQ gt 2 Thanks Mathematica 有一种机制能够在简单情况下确定规
  • 从问题到 Wiki 的 GitHub 链接

    我想要链接维基页面来发布文本 语法链接到问题池中 text page 不起作用 怎么做 您还可以使用相对路径 这是我的一个项目的示例 Using a Shell Configuration File wikis Using a Shell
  • mySQL 分区多文件与单文件性能对比?

    对大型表进行分区时 我可以选择将标志 innodb file per table 设置为 TRUE 或 FALSE True 将创建许多文件 每个分区一个 并大大增加我的磁盘使用量 但允许我将分区分布在不同的卷上 我不打算这样做 FALSE
  • 区分手指触摸和手/掌托

    Is there any technique to differentiate between finger touch and palm rest on surface while drawing on touch surface in
  • F#:可以在运行时动态绑定度量单位吗?

    我对 F 非常陌生 对测量单位功能很感兴趣 并且大致了解它的正常工作原理 但想知道是否可以将测量值绑定到我们不知道测量值的值直到代码执行 我正在查看的实际示例是将浮点数绑定为货币值 其中度量单位是从数据库查找中推断出来的 假设每种货币 美元
  • 这个视图控制器是否在“willSet/didSet”对中泄漏?

    你有一个 vc 绿色 它有一个面板 黄色 支架 假设您有十个不同的视图控制器 价格 销售 库存 卡车 司机 调色板 您将一次将它们放入黄色区域 它将动态加载故事板中的每个 VC instantiateViewController withI
  • 开放 NLP 名称查找器培训

    我正在根据在线手册 http opennlp apache org documentation 1 5 2 incubating manual opennlp html 构建一个名为 en ner person train 的 15k 行训
  • MongoDB 中的“LIKE”命令(mongomapper)

    如何像 MongoDB 中的 sql 那样使用过滤数据 而不是在 Rails 应用程序上使用 gem mongomapper 谢谢 如果您要查找字符串的部分匹配项 可以使用正则表达式进行查询 这是 mongomapper 文档的相关部分 h
  • SharePoint 2010 - 从 Kerberos 更改为基于声明的身份验证

    我想在 SharePoint 2010 Enterprise Edition 环境中将身份验证提供程序从 Kerberos 更改为基于声明 我的 SharePoint 环境中可能会出现哪些问题 我听说如果 RSS 阅读器 Web 部件使用我
  • 需要算法帮助来查找 DAG 中的最大路径

    假设我有这个有向无环图 DAG http en wikipedia org wiki Directed acyclic graph 其中从每个节点 底行中的节点除外 到其下面的两个节点都有一条有向边 7 3 8 8 1 0 2 7 4 4
  • CakePHP:创建新的 HABTM 行而不是更新其他行

    我有两个具有 HABTM 具有且属于多个 关系的模型 Qsets 和 Questions 以下操作 在 QsetsController php 中 应该会在 qsets questions 表中产生一个新行 新问题出现在新的 qset 中