Доброго времени суток. Многие согласятся с тем, что Zend Framework — это отличный инструмент, который позволяет сильно сократить время разработки проекта (и не только), но всё-равно часто приходится делать copy-paste методов в разных местах (контроллерах, моделях и т. д. ). Одним из таких мест является модель таблицы базы данных.
Zend_Db_Table и так позволяет легко выполнять CRUD операции.
Итак, какие действия при написании, например, модуля для CMS мы выполняем постоянно?
Итак приступим.
Создадим класс library/App/Db/Table.php
Создадим метод для добавления элемента
Теперь создадим метод для обновления элемента по ключевому полю id
Метод удаления элемента по ключевому полю id
Метод выборки элемента по ключевому полю id
И для удобства будем использовать магический метод getItemsBy, который позволит выбрать элементы по значению любого поля.
Как теперь это использовать? Создадим модель таблицы test (applicaiton/models/DbTable/Test.php) расширяющюю созданный нами класс, где будут доступны все написанные нами методы
Пример для контроллера
Это только несколько методов для примера, которые можно вынести отдельно для частого использования. Так же можно написать магические методы для обновления и удаления элементов, для управления ветками каталогов и т.д.
P.S. не забудте добавить library/App для автоподгрузки классов, например в .ini конфиге
autoloaderNamespaces[] = «App_»
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_»