从表中删除会导致基数违规

Yac*_*oby 0 php mysql zend-framework

我有一个方法,使用zend框架提供的sql适配器从数据库中删除行.

class Table extends Zend_Db_Table_Abstract {

    ...

    $where = $this->getAdapter()->quoteInto(
        'ModID=? AND URL=?',
        array((int)$mid, $url->toString())
    );
    $this->delete($where);
Run Code Online (Sandbox Code Playgroud)

问题是这段代码给出了错误:

Zend_Db_Statement_Exception: SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)

在where子句中只指定一列的类似代码可以正常工作.

是否有另一种方法可以根据多列的值删除行?

Pat*_*and 5

您可以使用Zend_Db_Select的已构建功能来执行此类操作:

$select = $this->select();
               ->where('modID = ?', (int)$mid);
               ->where('URL = ?', $url->toString());

$where = $select->getPart(Zend_Db_Select::WHERE);

$this->delete($where);
Run Code Online (Sandbox Code Playgroud)

有关此解决方案的一些注意事项:

  • (专业版)利用Zend_Db_Select中现有的引用功能
  • (Pro)利用适配器方法的Zend_Db_Table :: delete代理,因此您可以提供SQL部件的数组.从文档:

    "由于表delete()方法代理数据库适配器delete()方法,因此该参数也可以是SQL表达式的数组.表达式使用AND运算符组合为布尔项."

  • (Con)创建Zend_Db_Select对象,但您实际上只对where子句感兴趣

如果delete方法接受Zend_Db_Select或者Zend_Db_Constraint(不存在的类),那就更好了.您当然可以将其设置为实用程序方法,以便所有表都可以使用它,从而使删除更容易.

另一种方法是简单地跳过select对象:

$where = "{$this->getAdapter()->quoteInto('modID = ?', (int)$mid)} AND 
          {$this->getAdapter()->quoteInto('URL = ?', $url->toString)}";
Run Code Online (Sandbox Code Playgroud)