【问题标题】:How to debug when CakePHP Model::save() doesn't attempt an INSERT当 CakePHP Model::save() 不尝试插入时如何调试
【发布时间】:2009-02-19 18:16:51
【问题描述】:

我正在花时间从名为 ItemView 的模型中保存最简单的记录:

if($this->save($this->data)) {
  echo 'worked';
} else {
  echo 'failed';
}

$this->数据在哪里:

Array
(
    [ItemView] => Array
        (
            [list_id] => 1
            [user_id] => 1
        )
)

我的桌子是:

CREATE TABLE IF NOT EXISTS `item_views` (
  `id` int(11) NOT NULL auto_increment,
  `list_id` int(11) NOT NULL,
  `user_id` int(11) default NULL,
  `user_ip` int(10) unsigned default NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED AUTO_INCREMENT=1 ;

在调试模式下查看查询转储,Cake 甚至没有尝试插入,所以我不知道如何调试。

任何帮助将不胜感激。

【问题讨论】:

标签: cakephp


【解决方案1】:

哇,浪费了我生命中两个悲惨的小时。

请记住,您的 beforeSave() 必须返回 true

【讨论】:

  • 太棒了!感谢您为我节省了这 2 个小时! :)
  • 我花了 8 个小时复制这个并找到相同的东西。希望我早点搜索过!
  • 啊,谢谢你救了我的命。这个问题花了我 2 个小时
【解决方案2】:

调试 Model->save() 检查验证错误和最后的 sql 查询

$this->Model->save($data);

debug($this->Model->validationErrors); //show validationErrors

debug($this->Model->getDataSource()->getLog(false, false)); //show last sql query

【讨论】:

    【解决方案3】:

    在 cakephp 3.x 中,您可以在插入/更新期间进行调试

    if ($this->TableName->save($entity)) {
          // success 
    } else {
    // if not save, will show errors 
      debug($entity->errors());
    
    }
    

    【讨论】:

    • 较新的版本好像使用:$entity->getErrors()
    【解决方案4】:

    总是让我明白的是,如果我修改了实际的表(通常是通过向它添加属性),那么你必须刷新你的缓存。通常只需删除以下两个文件夹中的所有内容即可:

    tmp > cache > models 
    tmp > cache > persistent
    

    【讨论】:

    • 这非常有帮助!!经过 2 小时的闲逛,我赢了……干杯!!
    【解决方案5】:

    您使用的控制器名称是什么?

    控制器和模型的名称不匹配也会导致一些错误。如果您使用的是 Posts 控制器,则应使用 Post 模型。如果您在其他控制器中使用Post 模型;说BlogsController 然后Post 模型应该像下面这样加载:

        <?php
        class BlogsController extends AppController
        {
            public function index()
            {
                $this->loadModel("Post");    
                //Here I'm loading other model inside blogs controller
                if($this->request->is('post'))
                {
                    $this->Post->save($this->request->data);
                }
            }
        }
        ?>
    

    【讨论】:

      【解决方案6】:

      可能是这样的

      $this->Model->set($this->data);
      
      $errors = $this->Model->validate();// or perhaps validationError(), please confirm
      
      if(!$errors) {
         $this->Model->save();
      }else{
         //show errors
         pr($errors);
      
      }
      

      【讨论】:

        【解决方案7】:

        同样的问题。我浪费了我生命中的两个小时。

        解决方案: 我忘了这个:

        array('post', 'put')
        

        【讨论】:

          【解决方案8】:

          可能是,Validations返回false..你可以检查一下

          $this->Model->save($this->data, false);
          

          设置 false 并检查现在是否有数据插入,如果是则验证错误

          【讨论】:

          • 什么?不如只检查 Model->validationErrors 而不是失败?
          猜你喜欢
          • 2015-04-22
          • 2019-09-21
          • 1970-01-01
          • 2021-06-19
          • 2018-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          相关资源
          最近更新 更多