【问题标题】:Zend_Db - Building a Delete QueryZend_Db - 构建删除查询
【发布时间】:2011-03-03 18:57:53
【问题描述】:

我正在尝试在 Zend Framework 中重新创建以下内容,但不知道该怎么做:

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 中改编的,并且在粘贴时没有正确更改语法。我已经编辑了示例以修复它。

【问题讨论】:

  • @rg88 不清楚您需要删除什么。删除的语法是DELETE FROM [table_name]
  • 你在使用什么 dbms(我会假设 mysql?)你的语法是非标准的,而且很奇怪。如果您只想从一列中删除数据,则应使用 UPDATE 并将该列设置为 NULL、''、0 等。DELETE 专门用于删除整行,除非您的 dbms 支持我不熟悉的内容。
  • 从哪里获得该语法:DELETE [something] FROM table [where] ? MySQL、PostgreSQL 或 Oracle 都没有使用它。在DELETE 之后你不需要任何东西,因为你删除的是整行,而不是列值。
  • DELETE 删除整行,n
  • @criticus @Matt @singles - 我未能正确编辑示例。我已经更新了我的示例.. 对此感到抱歉。

标签: zend-framework zend-db


【解决方案1】:

想通了……

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/ 将删除条目。当然,任何点击该 url 的人都会删除这些条目,但我已经采取了我的示例中未包含的步骤来处理这个问题。希望这对某人有所帮助。

【讨论】:

  • 我假设$data 继承自Zend_Db_Table_Abstract。因此,在您的 pruneOld 方法中,您可以使用 $this-&gt;getAdapter() 访问数据库适配器 - 您不必从注册表中获取它。第二件事 - 在模型内部,您还有方法 delete(),它采用一个参数 - where 数组。
【解决方案2】:

我通常这样做是为了删除一行

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

$row->delete();

【讨论】:

  • 此表单的问题是您正在处理两个查询,最少(一个用于选择,一个用于删除)来执行删除操作。 pdo 删除操作接受相同的参数并且只执行一个查询。
【解决方案3】:

尝试: $db->delete($table, array( '日期(time_cre) new Zend_Db_Expr('curdate() - 间隔 4') ));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多