У меня есть метод, который удаляет строку из базы данных с помощью адаптера 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_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_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)}";