2011-05-08 92 views
0

考慮下面的例子:(從Zend的快速入門教程BTW)爲什麼我們需要在這裏取消設置?

public function save(Application_Model_Guestbook $guestbook) 
{ 
    $data = array(
    'email' => $guestbook->getEmail(), 
    'comment' => $guestbook->getComment(), 
    'created' => date('Y-m-d H:i:s'), 
); 

    if (null === ($id = $guestbook->getId())) { 
    unset($data['id']); 
    $this->getDbTable()->insert($data); 
    } else { 
    $this->getDbTable()->update($data, array('id = ?' => $id)); 
    } 
} 

爲什麼我們需要設定解除呢? 我的意思是,如果我們之前沒有聲明它,爲什麼我們需要銷燬一個特定的數組鍵? 更奇怪的是,我們在哪裏宣佈它呢?

我們可以對getDbTable方法一看,但即使看着它,我沒有找到答案:

public function getDbTable() 
{ 
    if (null === $this->_dbTable) { 
     $this->setDbTable('Application_Model_DbTable_Guestbook'); 
    } 
    return $this->_dbTable; 
} 

如果我們看看到setDbTable方法,有沒有什麼地方是沒有$的數據。

public function setDbTable($dbTable) 
    { 
     if (is_string($dbTable)) { 
      $dbTable = new $dbTable(); 
     } 
     if (!$dbTable instanceof Zend_Db_Table_Abstract) { 
      throw new Exception('Invalid table data gateway provided'); 
     } 
     $this->_dbTable = $dbTable; 
     return $this; 
    } 

我知道,Zend框架會自動找到我們的表在這裏的ID:

class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract 
{ 
    /** Table name */ 
    protected $_name = 'guestbook'; 
} 

但如果這是某種聯繫,我不明白...

我相信我已經把所有的相關信息。不過,如果沒有什麼相關的,也許我失去了一些東西在這裏: (源) http://framework.zend.com/manual/en/learning.quickstart.create-model.html

非常感謝

+0

如果$ data數組有一個來自其他地方的id,那麼您只需要在那裏取消設置,但是因爲您只是顯示了一些我們可以肯定說的代碼。如果$ data在其他地方設置了id。 – Prix 2011-05-08 11:55:21

+0

用參考鏈接更新了我的問題。 – MEM 2011-05-08 12:05:29

回答

2

該代碼似乎意味着總是設置$data['id'],但它可能有一個空值('''0')。 unset用於防止INSERT SQL查詢嘗試插入固定ID爲0的每個新記錄(或者爲了防止由於無效的SQL語法而導致查詢中斷,無法僅通過此信息進行分析)。

更新:看完一次之後,很明顯,該陣列$data無法有其id成員設置在所有(沒有代碼,可以設置它)。因此,這條代碼現在完全是冗餘的代碼編寫方式。它可能是從以前版本的代碼中剩餘的。

+0

謝謝。至少現在我明白了它的必要性。我還不知道它從哪裏來。我會更新我的問題以添加getDbTable和setDbTable方法,這可能會有所幫助。 – MEM 2011-05-08 12:08:27

+0

我已經添加了更多信息。我只是想確定一下,因爲這是Zend官方文檔,我真的懷疑我的技能,所以,也許我錯過了一些明顯的東西,或者即使不明顯,也是Zend做的,我不知道。 :s - 只需要確認即可繼續。 :) – MEM 2011-05-08 12:18:24

+2

@MEM:不,你不會錯過一些明顯的東西。 '$ data'在本地設置,並且不能由該函數之外的任何代碼修改。沒有辦法,它可以有一個'ID'鍵代碼站立。 – Jon 2011-05-08 12:19:45

2

大概id是自動增量場。 unset用於確保INSERT語句不會使用隨機ID,但是null

+0

感謝您的信息。現在我知道我們可以使用未設置的提議。 :) – MEM 2011-05-08 12:20:58

相關問題