Модели — это набор классов для работы с данными (хранением, обработкой и т.д.). Дополнительно каждый класс обычно представляет конкретную сущность системы (материал, категория, тип др.).
В данном случае мы будем говорить только о тех, которые работают с базой данных компонента.
Замечу сразу, что то, что мы будем рассматривать, можно назвать моделями только с натяжкой, но тем не менее они выполняют свои функции — абстрагирование от базы данных.
Рекомендуется использовать для работы с базой данных именно эти сущности. Тогда это не разрушит целостности данных в системе и будут учитываться различные события. Говорю это для любителей работать с базой данных чистыми SQL-запросами.
Стандартные вещи делаются с помощью хелпера table.
Частично об этом мы говорили в статье про API компонента Zoo (JBZoo). Теперь посмотрим более сложные примеры.
// возьмем ссылку, чтобы наш код был короче $itemModel = $this->app->table->item; $categoryModel = $this->app->table->category; // материалы определенной категории $items = $itemModel->getByCategoryl($appId, $catId); // выбрать материалы по автору $items = $itemModel->getByUser($appId, $userId); // простая произвольная выборка // $ids = произвольный набор ID материалов $conditions = array( 'id IN (' . implode(',', $ids) . ')' ); $items = $itemModel->all(compact('conditions')); // привычный для Zoo способ записи $items = $itemModel->all(array('conditions' => $conditions)); // более понятная запись // выберем первый материал по алфавиту из каталога id=10 $categories = $categoryModel->all(array( 'conditions' => array( 'application_id=?', 10 ), 'order' => 'name', 'limit' => 1, ));
Стандартный конструктор для выборок в Zoo далеко не самый гибкий. Поэтому мы с помощью JBZoo добавили свои модели. Все они находятся тут /media/zoo/applications/jbuniversal/framework/models/
Рассмотрим пару примеров:
$options = array( 'category_nested' => true, // выбирать из вложенный категории 'limit' => array(2, 10), // offset и limit 'user' => true, // учитывать ID автора (текущий пользователь) 'published' => 1, // учитывать состояние публикации 'order' => 'alpha' // сортировка ); // $appId, $catId, $typeId - могут быть конкретным значением или массивом $items = JBModelItem::model()->getList($appId, $catId, $typeId, $options); // произвольная фильтрация на основе индекса JBZoo // массив $elements полностью совпадает со структурой запроса из фильтра. $elements = array( '<ELEMENT_ID>' => 'Значение', ); $items = JBModelFilter::model()->filter($elements);
Материал имеет очень много зависимостей в базе (комментарии, индекс, категории, каталоги, теги и прочее прочее). Эти связи распространяются почти на все таблицы Zoo.
Чтобы правильно удалить материал (либо любую другую сущность), нужно вызывать только методы Zoo. Иначе у вас в базе будет хранится разнообразный хлам и как следствие — скрытые ошибки базы данных и лишний объем.
Для этих целей у каждого класса таблицы предусмотрен метод delete():
$tableItem = $this->app->table->item; $item = $tableItem->get(42); $tableItem->delete($item);
Таким образом, удаляются все зависимости, сама запись + будет вызван системный триггер (событие), который выполнит все привязанные действия, например, удаление связанных картинок у материалов.
Вы можете обратиться на наш специальный форум техподдержки JBZoo. Если у вас нет активного аккаунта со знаком «плюс» в тарифном плане, то вы можете задать свой вопрос в одном из этих разделов или на любой из наших контактов. Форум специально предназначен для JBZoo, приоритет и скорость ответа там выше.