【发布时间】:2020-02-02 16:27:29
【问题描述】:
希望有人能指出我正确的方向。
我有一个应用程序,其中包括(除其他外)建议和评估。它们与一个包含额外字段的连接表连接在一起,我想更新这些字段,但我正在努力弄清楚如何更新。
正如您在上面看到的,当我创建推荐时,我设置了以下字段:
- default_user_impact
- default_business_impact
- default_deployment_complexity
- default_criticality
现在,当我创建一个新的评估或编辑一个没有链接任何建议的评估时,评估保存得很好,因为不需要将任何内容写入连接表。
当我尝试编辑评估以包含一个或多个建议时,应用程序尝试将链接写入连接表并失败,因为未指定 user_impact、business_impact、deployment_complexity 和 criticality 字段 - 完全正常,因为我有在 MySQL 中将字段设置为必需的吗?我在 CakePHP 中遇到的错误是
SQLSTATE[HY000]:一般错误:1364 字段 'user_impact' 没有默认值
我希望能够在编辑或创建评估时使用建议表中的值来填充相应的连接表条目。有什么想法可以解决这个问题吗?
举个例子:
- user_impact = default_user_impact
- business_impact = default_business_impact
- deployment_complexity = default_deployment_complexity
- criticality = default_criticality
我想这样做的原因是,我可以使用这些字段的值设置建议,然后如果用户想要运行评估并且他们只想为自己的评估调整值,那么它就赢了'不影响他人等。
这是我的 AssessmentsTable 关联。
$this->belongsToMany('Recommendations', [
'foreignKey' => 'assessment_id',
'targetForeignKey' => 'recommendation_id',
'joinTable' => 'assessments_recommendations',
'through' => 'assessments_recommendations',
]);
这是我的 RecommendationsTable 关联。
$this->belongsToMany('Assessments', [
'foreignKey' => 'recommendation_id',
'targetForeignKey' => 'assessment_id',
'joinTable' => 'assessments_recommendations',
'through' => 'assessments_recommendations',
]);
这是我的 AssessmentsRecommendations 协会:
$this->belongsTo('Assessments', [
'foreignKey' => 'assessment_id',
'joinType' => 'INNER',
]);
$this->belongsTo('Recommendations', [
'foreignKey' => 'recommendation_id',
'joinType' => 'INNER',
]);
这是我的 AssessmentsController 编辑功能的样子:
public function edit($id = null)
{
$assessment = $this->Assessments->get($id, [
'contain' => ['Recommendations'],
]);
if ($this->request->is(['patch', 'post', 'put'])) {
$assessment = $this->Assessments->patchEntity($assessment, $this->request->getData(), ['associated'=>['Recommendations._joinData']]);
if ($this->Assessments->save($assessment, ['associated' => ['Recommendations._joinData']])) {
$this->Flash->success(__('The assessment has been saved.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('The assessment could not be saved. Please, try again.'));
}
$clients = $this->Assessments->Clients->find('list', ['limit' => 200]);
$recommendations = $this->Assessments->Recommendations->find('list', ['limit' => 200]);
$this->set(compact('assessment', 'clients', 'recommendations'));
}
现在,当我将 beforeSave 函数添加到 AssessmentsRecommendationsTable 时,我看到以下错误:
传递给 App\Model\Table\AssessmentsRecommendationsTable::beforeSave() 的参数 2 必须是 App\Model\Table\EntityInterface 的实例,给定的 Cake\ORM\Entity 的实例,在 /var/www/html/ 中调用csa-portal/vendor/cakephp/cakephp/src/Event/EventManager.php 在第 310 行
任何帮助将不胜感激。
【问题讨论】:
-
你用的是哪个 cakephp 版本?
-
我使用的是 CakePHP 4.0.3。
标签: mysql cakephp cakephp-3.0