在 CakePHP 中使用 saveAll() 保存多个 hasMany 数据,而无需在视图中写入 id
Posted
技术标签:
【中文标题】在 CakePHP 中使用 saveAll() 保存多个 hasMany 数据,而无需在视图中写入 id【英文标题】:Save multiple hasMany data with saveAll() in CakePHP without writing id's in the view 【发布时间】:2011-05-06 21:13:37 【问题描述】:我终于用 saveAll() 保存了我的 hasMany 数据 - (一个 hasMany Schedules 的事件)。
我通过在 events/admin_edit.ctp 上重复 $this->data['Schedule'] 数据并构建与该事件相关的任何/所有时间表的所有字段来使其工作。
这看起来不错(我认为),但我的问题/问题是 - 我必须将 Schedule.id 和 Schedule.event_id 字段添加为隐藏字段,以便它知道要保存哪些数据。这似乎非常不安全/错误...... 1)这是正确的方法吗?和 2) 不能有人将字段编辑为另一个 ID,然后点击保存以更新不同的事件信息吗?
我的下一个假设是在执行 saveAll() 之前我必须在控制器中构建某种检查...但是我写的越多,它就会变得越复杂,Cake-好像是这样。
非常感谢任何关于如何更好地做我正在做的事情的想法/建议,或者在执行 saveAll() 之前要检查什么的见解。
【问题讨论】:
我没有仔细阅读,我在创建时回复了如何做到这一点。看起来我过去的处理方式完全相同,所以我很想知道是否有替代方案。 【参考方案1】:我假设您的用户可以编辑自己的事件。如果是这种情况,最简单的方法是添加一个验证规则,以验证是否允许用户编辑提交的计划。
在您的操作中,在调用 save() 之前,将当前用户 ID 注入每条记录。即:
$this->data['Schedule'][0]['user_id'] = $this->Auth->user('id');
这可能不完全有效,但应该让你接近。在您的 Schedule 模型中,添加验证规则:
var $validate = array(
'user_id' => array(
'rule' => 'checkAuth'
'message' => 'Nice try buddy.',
'on' => 'update'
)
);
function checkAuth()
$authorized = true;
if(!$this->hasAny(array(
'Schedule.id'=>$this->data['Schedule']['id'],
'Schedule.user_id' => $this->data['Schedule']['user_id'])))
$authorized = false;
return $authorized;
【讨论】:
太棒了!我一有机会就会尝试,迫不及待地想验证它是否有效并将其标记为答案!我不知道您可以使用这样的功能进行验证!谢谢! (如果你碰巧看到这个,并且知道是否有任何页面可以解释更多关于这样做的信息,或者它的名称?那也很棒。谢谢,泰勒! 是的,正确的术语是自定义验证规则。 book.cakephp.org/view/1179/Custom-Validation-Rules @Tyler - 关于如何检查模型中“管理员”组中的用户有什么想法吗? 用户表中有group_id FK吗?如果是这样,您也可以注入 group_id/代替,并针对它编写验证器。 @Tyler - 我确实有一个 group_id - 不知道你对“注入 group_id”的意思是什么 - 也许我应该把它写成另一个问题。以上是关于在 CakePHP 中使用 saveAll() 保存多个 hasMany 数据,而无需在视图中写入 id的主要内容,如果未能解决你的问题,请参考以下文章
CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?
是否可以使用 Cakephp 中的 saveAll 一次将所有相关记录插入到 HABTM 中?
Cakephp - saveAll 和 beforeSave