Всем привет.
Англоязычный блог ProDevTips, посвящённый веб-разработке, опубликовал заметку про расширение возможностей Zend_Db_Table. Расскажу вкратце, что же они предлагают, немного дополнив их идеи своими поправками.
Очистка вставляемых данных
При insert’е стандартными средствами Zend_Db_Table_Abstract (который использует Zend_Db) существование в таблице столбцов проверяется только средствами СУБД. Приведённый ниже способ расширит Zend_Db_Table так, чтобы массив вставляемых данных очищался от лишних данных.
1 2 3 4 5 6 7 | function cleanArray($arr){ return array_intersect_key($arr, array_combine($this->_cols, $this->_cols)); } function insert(array $insert_arr){ return parent::insert($this->cleanArray($insert_arr)); } |
Думаю, пояснять в этом коде совершенно нечего – всё элементарно. Однако код, на мой взгляд, получился довольно изящным.
В оригинале предлагается использовать этот способ для вставки данных напрямую из массива $_POST. Главное – не забывать фильтровать вставляемые данные. От SQL-инъекций Zend_Db защищает, а вот тот же trim() (или Zend_Filter_StringTrim) придётся делать самим.
Обновление записи по primary key
Ничего особенного, просто немного удобства:
1 2 3 | function updateOne($update_arr, $id_value){ return parent::update($this->cleanArray($update_arr), "{$this->_primary[1]} = $id_value"); } |
Проверка существования записей
1 2 3 | function exists($where){ return $this->fetchAll($where)->count() > 0 ? true : false; } |
Удаление записи по primary key
1 2 3 | function deleteOne($id_value){ return $this->delete("{$this->_primary[1]} = $id_value"); } |
Удаление первой из найденных строк
1 2 3 4 5 6 | function deleteFirst($where, $key = false){ $key = $key == false ? $this->_primary[1] : $key; $id = $this->fetchAll($where)->current()->$key; parent::delete("$key = '$id'"); return $id; } |
Обновление нескольких записей
1 2 3 4 5 6 7 |
Пример использования: updateAll(array(1 => ‘ok’, 3 => ‘not_ok’), ’status’, ‘id’)
Выборка одной ячейки
Здесь с оригиналом расхождение. Очевидно, они просто не знают про метод find(), поэтому создали следующий метод:
1 2 3 4 | function fetchOne($id, $as_arr = false){ $result = $this->fetchRow("{$this->_primary[1]} = $id"); return $as_arr ? $result->toArray() : $result; } |
Никакой практической ценности здесь я не вижу, ибо у нас есть find(). Вместо этого я предлагаю свой вариант fetchOne(), с функционалом, аналогичным Zend_Db_Adapter_Abstract::fetchOne():
1 2 3 4 | function fetchOne($where, $field){ $result = $this->fetchRow($where); return $result ? $result->$field : false; } |
В статье есть ещё несколько советов, но я не посчитал их стоящими публикации здесь – слишком сомнительна их практическая польза. Вы можете ознакомиться с ними здесь.
Спасибо за внимание, всего доброго.
Igor says:
Хорошая статья, будем использовать.
22 июня 2008, 12:03vitaliy says:
return $this->fetchAll($where)->count() > 0 ? true : false;
6 июля 2008, 12:16результат тот же:
return $this->fetchAll($where)->count() > 0;
admin says:
Я бы даже сказал:
(bool)$this->fetchAll($where)->count() > 0;
Но автор этого кода не я, а ProDevTips, поэтому вносить изменения не стал.
6 июля 2008, 12:19Igor says:
Кстати, а каким макаром экранируются данные при такой втсавке?
6 июля 2008, 17:03$this->_usetTable->insert( $form->getValues() )
admin says:
Экранируются внутри DB-адаптера.
6 июля 2008, 17:29Nayre says:
Прошу прощения если залез не в “тот” топик, изучаю ZF 3 день, и столкнулся с такой проблемой. Как средствами Zend_Db_Table или Zend_Db_Table_Abstract при использовании функции insert получить id(идентификатор) вставленной записи?
24 августа 2010, 11:29RooTooZ says:
$accounts->insert( $data );
30 сентября 2010, 13:36$last_insert_id = $accounts->getLastInsertId();
Ale says:
есть ли возможность выборки дерева или ветки по заданному идентификатору?
17 марта 2011, 9:17Eugene says:
$last_insert_id = $accounts->insert( $data );
??
25 декабря 2011, 1:25