Zend_Db_Table и так позволяет легко выполнять CRUD операции.
Итак, какие действия при написании, например, модуля для CMS мы выполняем постоянно?
- Добавить элемент
- Выбрать элементы по какому-либо полю
- Удалить элемент
- Обновить элемент
Итак приступим.
Создадим класс library/App/Db/Table.php
<?php
class App_Db_Table extends Zend_Db_Table_Abstract
{
}
* This source code was highlighted with Source Code Highlighter.Создадим метод для добавления элемента
public function addItem($data){
if(empty($data)) {
throw new Exception("Нет данных для добавления");
}
return $this->insert($data);
}
* This source code was highlighted with Source Code Highlighter.Теперь создадим метод для обновления элемента по ключевому полю id
public function updateItemById($id, $data = NULL){
if(empty($id)) {
throw new Exception("Необходимо указать id обновляемого элемента");
}
if(empty($data)) {
throw new Exception("Нет данных для обновления");
}
$where = $this->getAdapter()->quoteInto('id = ?', (int)$id);
return $this->update($data, $where);
}
* This source code was highlighted with Source Code Highlighter.Метод удаления элемента по ключевому полю id
public function deleteItemById($id){
if(empty($id)) {
throw new Exception("Необходимо указать id удаляемого элемента");
}
$result = $this->delete(array('id = ?' => (int)$id));
if(0 === $result) {
throw new Exception("Элемент не найден");
}
}
* This source code was highlighted with Source Code Highlighter.Метод выборки элемента по ключевому полю id
public function getItemById($id){
if(empty($id)) {
throw new Exception("Необходимо указать id для выбора элемента");
}
$select = $this->getAdapter()->quoteInto('id = ?', (int)$id);
$result = $this->fetchRow($select);
if(NULL !== $result) {
return $result->toArray();
}else{
throw new Exception("Элемент не найден");
}
}
* This source code was highlighted with Source Code Highlighter.И для удобства будем использовать магический метод getItemsBy, который позволит выбрать элементы по значению любого поля.
public function getItemsBy($key, $value){
$where = $this->getAdapter()->quoteInto("$key = ?", $value);
$result = $this->fetchAll($where)->toArray();
if(count($result) > 0) {
return $result;
}else{
throw new Exception("Элементы не найдены");
}
}
public function __call($name, $arguments) {
if(0 === strpos($name, 'getItemsBy')) {
array_unshift($arguments, substr($name, 10));
return call_user_func_array(array($this, 'getItemsBy'), $arguments);
}
throw new Exception("Неизвестный метод ".$name);
}
* This source code was highlighted with Source Code Highlighter.Как теперь это использовать? Создадим модель таблицы test (applicaiton/models/DbTable/Test.php) расширяющюю созданный нами класс, где будут доступны все написанные нами методы
class Model_DbTable_Test extends App_Db_Table
{
protected $_name = 'test';
}
* This source code was highlighted with Source Code Highlighter.Пример для контроллера
// Создадим объект модели таблицы Test
$model = new Model_DbTable_Test();
// Выберем элемент с id = 1
try{
$item = $model->getItemById(1);
}
catch (Exception $e){
print $e->getMessage();
}
// Выберем элемент используя магический мето getItemsBy()
try{
$item = $model->getItemsByName('itemname');
}
catch (Exception $e){
print $e->getMessage();
}
* This source code was highlighted with Source Code Highlighter.Это только несколько методов для примера, которые можно вынести отдельно для частого использования. Так же можно написать магические методы для обновления и удаления элементов, для управления ветками каталогов и т.д.
P.S. не забудте добавить library/App для автоподгрузки классов, например в .ini конфиге
autoloaderNamespaces[] = «App_»

