CakePHP 3.7.7有效保存多个实体

时间:2019-07-16 10:23:33

标签: cakephp cakephp-3.0 cakephp-3.x

CakePHP 3.7.7

我有一系列复选框。名称属性为:emailFrequency_dailyemailFrequency_weeklyemailFrequency_monthly

我想保存已检查的内容,并且需要将它们与我存储在会话中的其他一些数据一起保存:会话数据o_idu_id每次行都相同已插入。数据库中的frequency字段与相应的复选框匹配,并且每次都与上面的列表不同。

所以我尝试关注https://book.cakephp.org/3.0/en/orm/saving-data.html#saving-multiple-entities

在我的控制器中,我有以下内容

$TblAlertFrequency = TableRegistry::get('TblAlertFrequency');

$frequencies = [];

// 'daily' emails enabled
if ($this->request->getData('emailFrequency_daily')) {
    $frequencies[] = [
        'u_id' => $this->_UserModel->getUserId(),
        'o_id' => $this->_UserModel->getOrgId(),
        'frequency' => 'daily'
    ];
}

// 'weekly' emails enabled
if ($this->request->getData('emailFrequency_weekly')) {
    $frequencies[] = [
        'u_id' => $this->_UserModel->getUserId(),
        'o_id' => $this->_UserModel->getOrgId(),
        'frequency' => 'weekly'
    ];
}

// 'monthly' emails enabled
if ($this->request->getData('emailFrequency_monthly')) {
    $frequencies[] = [
        'u_id' => $this->_UserModel->getUserId(),
        'o_id' => $this->_UserModel->getOrgId(),
        'frequency' => 'monthly'
    ];
}

if (!empty($frequencies)) {
    $entities = $TblAlertFrequency->newEntities($frequencies);
    $TblAlertFrequency->saveMany($entities);
}

该消息显示500 Internal Server错误:

  

错误:无法插入行,某些主键值丢失。得到了(,),期望是(o_id,u_id)

为什么要这么做,因为我要传递这些值(o_idu_id)?

表结构如下:

    mysql> describe tbl_alert_frequency;
    +-----------+------------------------------------------+------+-----+---------+-------+
    | Field     | Type                                     | Null | Key | Default | Extra |
    +-----------+------------------------------------------+------+-----+---------+-------+
    | u_id      | mediumint(8) unsigned                    | NO   | PRI | NULL    |       |
    | o_id      | smallint(5) unsigned                     | NO   | PRI | NULL    |       |
    | frequency | enum('never','daily','weekly','monthly') | NO   |     | weekly  |       |
    +-----------+------------------------------------------+------+-----+---------+-------+

我唯一没有通过的是id,因为它是AUTO_INCREMENT,因此由MySQL在插入新行时编写。

我在这里编写的代码不是DRY,因为它会重复:

'u_id' => $this->_UserModel->getUserId(),
'o_id' => $this->_UserModel->getOrgId(),

但是,如果我删除了它们,将无法保存它们,并且每一行都需要它们。

肯定有一种更简便,更有效的方式编写此代码吗?

我也看过How to save multiple records in cakephp 3,但这似乎已经过时并且对我不起作用。

0 个答案:

没有答案