CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?

2023-12-11

我已经能够使用 CakePHP 的 saveAll 方法同时创建“成员”并将它们注册到“事件”中(创建 HABTM 链接记录),这非常棒。例如,此代码创建两个新的“Members”,并将每个人的记录添加到“EventsMember”表中,将它们注册为“Event”10:

$data = array(
  '0' => array(
    'Member' => array('email' => '[email protected]'),
    'Event' => array('id' => 10)
  ),
  '1' => array(
    'Member' => array('email' => '[email protected]'),
    'Event' => array('id' => 10)
  )
);
$this->Member->saveAll($data);

但是,“EventsMember”表中的记录还有一个名为“角色”的字段,其中包含“演示者”或“主持人”或“参加者”等内容,我想在创建关系时保存该数据。我尝试了这个,但它不起作用(“EventsMember”“角色”字段始终为空):

$data = array(
  '0' => array(
    'Member' => array('email' => '[email protected]'),
    'Event' => array('id' => 10),
    'EventsMember' => array('role' => 'Host')
  ),
  '1' => array(
    'Member' => array('email' => '[email protected]'),
    'Event' => array('id' => 10),
    'EventsMember' => array('role' => 'Attendee')
  )
);
$this->Member->saveAll($data);

我想知道这是否可能,并且我是否必须使用某种回调(例如 beforeSave 或 afterSave)来完成此操作?我读到,使用 saveAll 时这些回调存在一些问题,因此我正在寻找有关此处最佳实践的任何提示。

Thanks!

编辑:我采纳了 Adam 的建议并对我的模型进行了以下更改:

// Event.php
var $hasMany = array('EventsMember');

// Member.php
var $hasMany = array('EventsMember');

// EventsMember.php
var $belongsTo = array('Event', 'Member');

然后在我的控制器中,我的代码看起来几乎与我的第二个示例相同,除了我调用了saveAll()方法从EventsMember模型,如文档中所述:

$data = array(
  '0' => array(
    'Member' => array('email' => '[email protected]'),
    'Event' => array('id' => 10),
    'EventsMember' => array('role' => 'Host')
  ),
  '1' => array(
    'Member' => array('email' => '[email protected]'),
    'Event' => array('id' => 10),
    'EventsMember' => array('role' => 'Attendee')
  )
);
$this->EventsMember->saveAll($data);

结果没有Member or EventsMember记录完全被保存了。我尝试从以下位置触发保存Member model ($this->Member->saveAll($data);)这节省了Member记录,但不是加入EventsMember记录。

我尝试删除预先存在的 HABTM 关联,​​但没有任何区别。这beforeSave的方法EventsMember当我打电话时模型被触发$this->EventsMember->saveAll($data);但看起来它实际上不会保存任何东西。

我很受阻。

更新:事实证明,没有创建任何记录,因为加入记录都是使用事件 id 和会员 id 0 创建的,这违背了我在这两个字段组合上的唯一键(也就是说,没有会员可以注册事件两次)。

这是否表明加入模型 saveAll 功能未按记录工作,因为未创建成员记录(意味着加入记录中没有可使用的成员 id),并且现有事件 id 未传递到加入活动会员记录吗?

结论:我将控制器更改为在每个记录上循环并尝试$this->EventsMember->saveAll($data)对于数组的每个索引,而不是一次传递整个数组。它有效,但比我的第一个示例(在最顶部)慢得多。请注意,我正在使用事务,所以也许使用atomic => false;选项会加快速度,同时仍然允许我从任何无效记录中恢复。

最重要的是,如果您需要在连接表记录中保存额外的数据,则必须一次处理一个数据。如果没有,请使用顶部的方法以获得最佳性能。


您可以使用连接模型在这种情况下。

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

CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据? 的相关文章

  • 子目录中的 CakePHP 控制器和模型

    你好 我想知道如何将我的组件和模型放在子目录中 假设我有一个 Web 应用程序 它有 3 个不同的区域 管理员 用户 开发人员 每个区域执行不同的操作并具有完全不同的界面 所以我希望管理员去http www site com admin h
  • 多文档事务在使用 mongodb 4.08 社区服务器的 C# 中不起作用

    我需要使用 mongodb 事务更新多个文档 mongodb 社区服务器版本是 4 08 net 的 mongodb 驱动程序是 2 9 beta 也尝试过 2 8 从调试中 我可以看到它执行了 session AbortTransacti
  • 我可以在类变量中添加没有指定值的 PHP 数组键吗?

    我目前正在努力通过IBM 关于 CakePHP 的教程 http www 128 ibm com developerworks edu os dw os php cake1 html 有一次我遇到了这段代码
  • Postgres、更新和锁定顺序

    我正在研究 Postgres 9 2 有 2 个更新 每个更新都有自己的事务 一个看起来像 UPDATE foo SET a 1 WHERE b IN 1 2 3 4 另一个也类似 UPDATE foo SET a 2 WHERE b IN
  • Spring、JPA 和 Hibernate - 如何在没有并发问题的情况下增加计数器

    我正在使用 Spring 和 JPA Hibernate 但我对增加表中计数器的正确方法有点困惑 我的 REST API 需要根据用户操作增加和减少数据库中的某些值 在下面的示例中 喜欢或不喜欢标签将使标签表中的计数器增加或减少 1 tag
  • firebase云功能事务偶尔工作

    我有这样的云功能 exports updateNewsCount functions database ref channels channelId news newsId onWrite event gt const channelId
  • SQL Server - 即使在回滚的情况下如何确保标识字段正确增加

    在 SQL Server 中 如果涉及插入新行的事务被回滚 则标识字段中的数字将被跳过 例如 如果Foos表是99 然后我们尝试插入一个新的Foo记录但回滚 然后 ID 100 被 用完 下一个Foo行编号为 101 有什么方法可以改变这种
  • 如何使用多个Auth组件?

    我使用用户模型将身份验证组件配置为 管理页面 但现在 我还想为客户端创建 配置身份验证 我尝试 重写 inialize This is in my ClientsController php public function initiali
  • 关于pl/sql异常的问题

    以下文字摘录自oracle文档Oracle Database PL SQL 语言参考 11g 第 1 版 11 1 未处理的异常也会影响 子程序 如果退出子程序 成功后 PL SQL 将值分配给 输出参数 但是 如果您退出 带有未处理的异常
  • 在 CakePHP 中向文章添加评论

    我正在学习 CakePHP 这是我的第一个 MVC 我有一些 最佳实践 问题 这是我对显示新闻文章的看法 h1 h1 p p div class comment style margin left 50px p p div
  • 如何在 Django Admin 中禁用事务?

    I used transaction non atomic requests for 被超越的save in Person model如下所示 store models py from django db import models fro
  • 是否可以将外部数据拖放到 jstree 中?

    我正在开发一个需要构建分层导航菜单的项目 jstree https www jstree com看起来很适合这个 该树将被保存到数据库中 我计划使用 CakePHP树的行为 https book cakephp org 2 0 en cor
  • Cakephp-3.x:如何更改选定别名的数据类型?

    当我尝试这样做时 fields array id gt custom id title gt some name 我得到的结果有id作为字符串 If I do fields array custom id title gt some nam
  • 动画片段和返回堆栈

    我在使用或理解如何弹出时遇到问题 后台堆栈中的 FragmentTransactions 处理自定义 动画 具体来说 我希望它能够调用 out 动画 但是 看来不是 我有一个简单的方法来处理片段事务 FragmentTransaction
  • 2PC vs Sagas(分布式事务)

    我正在深入了解分布式系统 以及如何在此类系统中维护数据一致性 其中业务事务涵盖多个服务 有界上下文和网络边界 我知道以下两种用于实现分布式事务的方法 2 阶段提交 2PC Sagas 2PC 是一个应用程序协议透明地在平台的支持下利用全球A
  • TransactionScope 在某些机器上自动升级到 MSDTC?

    在我们的项目中 我们使用 TransactionScope 来确保我们的数据访问层在事务中执行其操作 我们的目标是not要求在我们的最终用户的计算机上启用 MSDTC 服务 问题是 在我们一半的开发人员机器上 我们可以在禁用 MSDTC 的
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 如何添加事件处理程序仅在 sqlalchemy 中提交事务后触发一次

    我正在使用 sqlalchemy 编写一些函数 这些函数被称为内部事务 例如 def create order session arg kw create order object order Order xxxx xxx session
  • 在 JUnit 中使用 Spring 测试服务时如何回滚数据库事务?

    我测试我的 DAO 和服务没有问题 但是当我测试时INSERTs or UPDATE我想回滚事务而不影响我的数据库 我在用着 Transactional在我的服务中管理交易 我想知道 是否有可能知道事务是否正常 但回滚它以防止更改数据库 这
  • 弹簧隔离支持吗? SQL快照隔离

    我们正在使用 SQL Server 快照隔离可能是提高性能和解决一些死锁问题的好方法 假设我们确实需要更改为快照隔离 我似乎找不到一种简单的方法来在 Springs 上启用快照隔离 Transactional 我发现以下 hibernate

随机推荐