Работа с базой данных и моделями в Zoo/JBZoo

9.0/10 оценка (5 голосов)

Модели — это набор классов для работы с данными (хранением, обработкой и т.д.). Дополнительно каждый класс обычно представляет конкретную сущность системы (материал, категория, тип др.).

В данном случае мы будем говорить только о тех, которые работают с базой данных компонента.

Замечу сразу, что то, что мы будем рассматривать, можно назвать моделями только с натяжкой, но тем не менее они выполняют свои функции — абстрагирование от базы данных.

Рекомендуется использовать для работы с базой данных именно эти сущности. Тогда это не разрушит целостности данных в системе и будут учитываться различные события. Говорю это для любителей работать с базой данных чистыми 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);

Таким образом, удаляются все зависимости, сама запись + будет вызван системный триггер (событие), который выполнит все привязанные действия, например, удаление связанных картинок у материалов.

API

У меня остались вопросы, где я могу их задать?

Вы можете обратиться на наш специальный форум техподдержки JBZoo. Если у вас нет активного аккаунта со знаком «плюс» в тарифном плане, то вы можете задать свой вопрос в одном из этих разделов или на любой из наших контактов. Форум специально предназначен для JBZoo, приоритет и скорость ответа там выше.