Удаление из таблицы приводит к нарушению кардинальности

0

У меня есть метод, который удаляет строку из базы данных с помощью адаптера sql, снабженного картой zend.

class Table extends Zend_Db_Table_Abstract {

    ...

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

Проблема в том, что этот код дает ошибку:

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

Аналогичный код, который указывает только один столбец в инструкции where, отлично работает.

Есть ли альтернативный метод для удаления строк на основе значений нескольких столбцов?

Теги:
zend-framework

1 ответ

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);

Некоторые моменты, касающиеся этого решения:

  • (Pro) Использует уже существующую функциональность цитирования в Zend_Db_Select
  • (Pro) Использует преимущества Zend_Db_Table:: delete прокси-сервера для метода адаптера, поэтому вы можете предоставить массив SQL-частей. Из документации:

    "Так как метод table() удаляет прокси-сервер к методу delete() адаптера базы данных, этот аргумент также может быть массивом выражений SQL. Эти выражения объединяются в виде булевых терминов с использованием оператора AND.

  • (Con) Создает объект Zend_Db_Select, но вас действительно интересует предложение where-clause

Еще лучше было бы, если бы метод delete принимал Zend_Db_Select ИЛИ, возможно, Zend_Db_Constraint (несуществующий класс). Разумеется, вы можете использовать этот метод Utility, чтобы он был доступен для всех ваших таблиц, что упростило удаление.

Другой метод - просто пропустить выбранный объект:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню