在 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 静默失败?

Cakephp - saveAll 和 beforeSave

cakephp:使用 saveAll(),导入的(非表单相关的)关联数据不保存

CakePHP 奇怪的 saveAll 问题。返回 true,但在数据库中没有任何内容