CakePHP 3.7.7
我有一系列复选框。名称属性为:emailFrequency_daily
,emailFrequency_weekly
和emailFrequency_monthly
。
我想保存已检查的内容,并且需要将它们与我存储在会话中的其他一些数据一起保存:会话数据o_id
和u_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_id
和u_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,但这似乎已经过时并且对我不起作用。