2011-03-03 20 views
0

我試圖重新在Zend框架下面,我不知道如何做到這一點:Zend_Db的 - 建立刪除查詢

DELETE FROM mytablename WHERE date(`time_cre`) < curdate() - INTERVAL 4 DAY 

我的想法是這樣的:

$table = $this->getTable(); 
$db = Zend_Registry::get('dbAdapter'); 
$db->delete($table, array(
    'date(`time_cre`) < curdate() - interval 4' 
)); 

不這似乎是正確的?

處理這樣的事情的最佳方法是什麼?


編輯:確認!對不起,我正在調整這個來自我用來測試的SELECT,並且在我粘貼時沒有正確更改語法。我編輯了示例來修復它。

+1

@ rg88目前尚不清楚你需要刪除什麼。 delete的語法是'DELETE FROM [table_name]' – criticus 2011-03-03 19:03:08

+0

你使用的是什麼dbms(我會假設mysql?)你的語法是非標準的,而且很奇怪。如果你只想從一列中刪除數據,你應該使用UPDATE並將列設置爲NULL,'',0等.DELETE專門用於刪除整行,除非你的dbms支持我不熟悉的東西。 – 2011-03-03 19:05:12

+0

從哪裏獲得該語法:'DELETE [something] FROM table [where]'? MySQL,PostgreSQL或Oracle都不使用它。 DELETE後,你不需要任何東西,因爲你刪除整行,而不是列值。 – singles 2011-03-03 19:06:40

回答

2

想通了......

public function pruneOld($days) { 
    $table = $this->getTable(); 
    $db = Zend_Registry::get('dbAdapter'); 
    $where = $db->quoteInto("DATE(`time_cre`) < CURDATE() - INTERVAL ? DAY", $days); 

    return $table->delete($where); 
} 

$table得到我想要編輯的表的參考...

$db抓住數據庫適配器的情況下,所以我可以用quoteInto() ..

$where構建查詢的主要部分,接受$days使事情變得更加靈活。

創建一個動作來調用這個方法......是這樣的:

public function pruneoldAction() { 

    // Disable the view/layout stuff as I don't need it for this action 
    $this->_helper->layout()->disableLayout(); 
    $this->_helper->viewRenderer->setNoRender(true); 

    // Get the data model with a convenience method 
    $data = $this->_getDataModel(); 

    // Prune the old entries, passing in the number of days I want to be older than 
    $data->pruneOld(2); 
} 

現在打:http://myhost/thiscontroller/pruneold/將刪除該條目。當然,任何人點擊該網址將刪除條目,但我已經採取了不包括在我的例子中的步驟來處理這個問題。希望這可以幫助某人。

+0

我假設'$ data'從'Zend_Db_Table_Abstract'繼承。因此,在你的'pruneOld'方法中,你可以使用'$ this-> getAdapter()'來訪問數據庫適配器 - 你不必從註冊表中獲取它。第二件事 - 內部模型中還有方法'delete()',它帶有一個參數 - 'where'數組。 – singles 2011-03-04 07:41:05

0

我平時這個刪除行

$table = new yourDB; 
$row = $table->fetchRow($table->select()->where(some where params)); 

$row->delete(); 
+4

此表單的問題在於您正在處理兩個查詢,最小值(一個用於選擇,一個用於刪除)執行刪除操作。 pdo delete操作接受相同的參數並僅執行一個查詢。 – 2011-03-04 15:28:12

0

嘗試: '?日期(time_cre)<' $ DB->刪除($表,陣列( =>新Zend_Db_Expr('CURDATE( ) - 區間4') ));