2010-08-09 75 views
11

我收到错误“无法刷新行,因为父母丢失”,当我尝试保存。这里是我的代码由于缺少父项,无法刷新行。 Zend框架

abstract class Webapp_Model_Resource_Db_Table_Abstract 
extends Zend_Db_Table_Abstract 
{ 
    /** 
    * Save a row to the database 
    * 
    * 
    * @param array    $info The data to insert/update 
    * @param Zend_DB_Table_Row $row Optional The row to use 
    * @return mixed The primary key 
    */ 

    public function saveRow($info, $row = null) 
    {   
     if (null === $row) { 
      $row = $this->createRow(); 
     } 
     $columns = $this->info('cols'); 
     foreach ($columns as $column) { 
      if (array_key_exists($column, $info)) { 
       $row->$column = $info[$column]; 
      } 
     } 

     return $row->save(); 
    } 
} 

当我打电话的saveRow()方法中,我通过在$ _ POST值($形式 - >的GetValues())

与我在其他模块中我已经重复使用这个类相同的应用程序,但现在我得到这个错误,我不知道为什么。我的桌子很简单:

CREATE TABLE `news` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `headline` varchar(100) DEFAULT NULL, 
    `snippet` varchar(500) DEFAULT NULL, 
    `full_text` text, 
    `author` varchar(100) DEFAULT NULL, 
    `publish_from` date DEFAULT NULL COMMENT 'Publish date', 
    `publish_to` date DEFAULT NULL COMMENT 'Take it down or mark as draft after this date', 
    `datecreated` timestamp NULL DEFAULT NULL COMMENT 'First created on', 
    `revised` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Timestamp for the last time it was revised', 
    `draft` tinyint(1) DEFAULT '0' COMMENT 'Should not be published', 
    `departments_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8 COMMENT='Stores news articles'; 

任何人都知道我在做什么错了?

:::::::::::::: ADDTION :::::::::::::

public function saveNews($post,$defaults = array()) 
    { 

     //get the form 
     $form = $this->getForm('article' . ucfirst($validator)); 
     //validate 
     if(!$form->isValid($post)) { 
      return false; 
     } 


     //get fitered values 
     $data = $form->getValues(); 
     //apply defaults 
     foreach($defaults as $col => $value) { 
      $data[$col] = $value; 
     } 

     //get the article if it exists 
     $article = array_key_exists('id', $data) ? 
        $this->getNewsById($data['id']) : null; 


     return $this->saveRow($data, $article); 
} 
+1

为什么不使用'Zend_Db_Table_Row_Abstract :: save()'?这里:http://framework.zend.com/apidoc/core/Zend_Db/Table/Zend_Db_Table_Row_Abstract.html#save – chelmertz 2010-08-09 15:28:10

+0

@chelmertz多数民众赞成在我使用的是。看看我的类如何扩展Zend_Db_Table_Abstract。 数据已成功插入数据库,但代码Zend_Db_Table_Row_Abstract :: save()也在内部调用_refresh(),那是当我得到错误 – browndash 2010-08-09 16:38:43

+0

我仍然不明白你为什么使用saveRow()而不是保存()。没关系,错误仍然存​​在,但首先你必须删除它,对吧?另外,您是否在保存时设置了departments_id?可能错误与关系有关。也张贴您的控制器的代码。 – 2010-08-09 17:17:00

回答

10

当你为主键传递一个空的值时,Zend似乎返回这个值而不是插入的自动增量值 - 即使用自动创建了一个新行增量值,插入的值不会被返回。

也许你的问题与此有关。如果是这样,请尝试在保存之前取消设置ID字段。

+0

谢谢,诀窍 – browndash 2010-09-09 15:56:51

+0

我可以证实这是一个原因。我以一种非标准的方式将Zend用作项目的一部分。我最终传递了一个带有空'id'列的$数组。虽然它会写,但它会返回一个错误,如上所述。 您实际上必须unset()$ array ['id']才能让Zend不抱怨。 – elb98rm 2014-08-29 10:36:26

-1

你能发布功能:

$this->getNewsById($id) 

这是你的问题...

+0

我不这么认为,当我创建一个新行时没有id,所以array_key_exists('id',$ data)返回false,并且getNewsById没有运行。因此,$ article = null的值传递给saveRow(),我已经检查过这个。所以我认为getNewsById的代码是无关紧要的,因为它不会运行在任何地方 – browndash 2010-08-10 06:29:43

+0

当你更新在数据库中找不到的行时,出现“无法刷新父行为父”的问题(要么是插入失败,要么是主键没有正确设置)。 – Chris 2010-08-10 16:06:14

0

检查您的$ info数组。你的主键可能有一些空的价值。 因此,array_key_exists($ column,$ info)返回true,并为您的行分配一个空的主键。这会导致错误,因为该键的行不存在。

尝试

if (array_key_exists($column, $info) and $column != 'YOUR_PRIMARY_KEY_NAME') 
{ 
     $row->$column = $info[$column]; 
} 
0

在我的情况的问题是缺少AUTO_INCREMENT。