2011-03-03 45 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') ));