2010-08-09 74 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。