调试save()返回false CakePHP 3.0

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调试save()返回false CakePHP 3.0相关的知识,希望对你有一定的参考价值。

我有一些代码在途中遇到了一些问题,我在调试它时遇到了麻烦。

这是它的简化版本。

$data = $this->request->data;

$form = $this->Forms->get($data['id'], [
    'contain' => ['FieldsForms' => ['data']
    ]
]);

$form = $this->Forms->patchEntity($form, $data,
    ['associated' => [
        'FieldsForms.Data',

    ]
]);

if ($this->Forms->save($form)) {
    // sunshine and rainbows
} else {
    // wailing and gnashing of teeth
}

我没有任何错误就嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷嗷呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜

验证错误是空的。

保存返回false - 任何关于如何调试它的建议都可以保存我留下的理智。

谢谢!

答案

问题原来是数据,正如预期的那样,但由于保存返回错误且数据非常大,因此无法立即看到。

我首先制作了问题数据的一个子集,显示了相同的行为,然后根据ndm的建议,更改了保存函数的ORM / Table.php代码,如下所示,以便能够看到问题所在:

$x = $entity->errors();
        if ($x) {
            debug($entity);
            debug($x);
        // if ($entity->errors()) {
            return false;
        }

这样我就可以看到发生了什么,然后继续修复数据。

另一答案

不确定早期的答案是否基于旧版本,但在最新的cakephp版本(3.4)中,您可以直接从控制器中的$ entity检索错误。 errors数组包含失败的每个实体字段,其子数组的验证失败。

<?php
// In Articles Controller
...

public function add(){
...
  if ($this->Articles->save($article)) {
    $this->Flash->success(__('The Article has been saved.'));
    return $this->redirect(['action' => 'index']);
  } else {
    Log::Debug($article->errors());
  }
另一答案

而是修改核心Cake代码,你可以这样做:

if ($this->Forms->save($form)) {
    // sunshine and rainbows
} else {
    //you know now what fail
    $andTheErrorsAre = $entity->getErrors();
}

以上是关于调试save()返回false CakePHP 3.0的主要内容,如果未能解决你的问题,请参考以下文章

从控制器调试CakePHP查询

Cakephp 3:使用save()一次更新多个列

Kohana 3.2 - ORM 的 pk() 方法在 save() (create()) 之后返回 false - 为啥?

使用 CakePHP 的 saveMany() 保存 >10000 条记录

CakePHP beforeSave false 防止不刷新就提交

cakephp 保存返回 true 但不保存