CakePHP空关联字段被保存而不是丢弃

时间:2017-01-05 13:43:28

标签: php cakephp cakephp-3.3

我在CakePHP上有一个小项目。它有一个名为articles的表,以及5个字段表,如类别,标签,图像等。这些关联主要是HasOne,关联表有多列。 在文章表上保存数据时,一切看起来都不错,但在一些关联上,例如:Article - >评分,如果我没有填写评级表的某些字段,则保存为null:

+----+------------+--------------+
| id | article_id | rating_value |
+----+------------+--------------+
|  1 |         36 |            3 |
|  2 |         56 |      5454.56 |
|  3 |         57 |            4 |
|  5 |         51 |         NULL |
+----+------------+--------------+

如果我添加一些验证,那么我无法保存文章,因为它需要进行验证。我想要的是,如果rating_value为空,则不能将其创建为null(实体被拒绝),并且必须保存该文章。 删除文章按预期工作,所有相关实体都将被删除。

我尝试在Model.beforeMarshall上更改$ data,但是这些类在表文章和评级中是私有的(我认为关联可能是问题)。

一些代码(控制器添加):

public function add()
    {
    $article = $this->Articles->newEntity();
    if ($this->request->is('post')) {
                $article = $this->Articles->patchEntity($article, $this->request->data, [
                    'associated' => [
                        'Ratings',
                    ]
                ]);
                if ($this->Articles->save($article)) {
                    $this->Flash->success(__('Saved.'));
                    return $this->redirect(['action' => 'index']);
                }
    }
    $this->set('article', $article);
}

由于这个原因,我删除了所有相关模型的所有验证。

// Articles Table
$this->hasOne('Ratings', [
    'className' => 'Ratings',
    'dependent' => true,
]);

// Ratings Table
$this->belongsTo('Articles', [
    'foreignKey' => 'article_id',
    'joinType' => 'INNER'
]);
// Rating.php Entity
protected $_accessible = [
    '*' => true,
    'id' => false
];
// Article.php Entity
protected $_accessible = [
    '*' => true,
];

2 个答案:

答案 0 :(得分:0)

我觉得每件事看起来都不错。可能你的表中的字段默认值为null。例如:

If 'rating_value' field in your table has default value null,
make that default full to none first.

如果验证失败,则不会保存任何内容而不是保存空值。如果仍然不起作用,请参阅:

debug($this->request->data);

如果数据从您的视图(表单)中正确显示,请查看。 另一个重要的事情是您可以使用不同的验证集进行关联。 (see here

答案 1 :(得分:0)

如果您要设置rating_value,那么它将尝试使用所有验证规则进行保存和验证。

  

如果rating_value为空,您可以删除相关数据

$dataToSave = $this->request->data;
if(empty($dataToSave['rating']['rating_value'])){
    unset($dataToSave['rating']);
}
$article = $this->Articles->patchEntity($article, $dataToSave, [
    'associated' => [
        'Ratings',
    ]
]);