SLOT-H: Методы работы



ORM предоставляет набор предопределённых методов для работы с данными, а также позволяет создавать собственные методы поиска в классах DbTables.




Предопределённые методы



getRow



Получение одной записи по первичному ключу или нескольких записей по массиву идентификаторов.

php
$record = Table::getRow($id);
$records = Table::getRow([1, 2, 3]);
Метод возвращает модель если передан один идентификатор, или массив моделей если передан массив идентификаторов.

getAll


Получение всех записей из таблицы.

php
$all = Table::getAll();

Поддерживает пагинацию и сортировку:

php
$page = 2; // вторая страница
$order = [Table::FIELD_NAME => true]; // true - ASC, false - DESC
$records = Table::getAll($page, $order);

getCount


Получение количества записей.

php
$count = Table::getCount();

Может принимать условия для подсчёта:

php
$count = Table::getCount([Table::FIELD_STATUS => 1]);

getByCondition


Получение записей по условиям, заданным через объект Select.

php
$records = Table::getByCondition();

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

remove


Удаление записей по условию.

php
Table::remove([Table::FIELD_STATUS => 0]);

Для таблиц с soft delete (DatabaseExtend) метод устанавливает deleted_at вместо физического удаления.

getByName


Получение записи по имени. Для работы метода в классе DbTable должно быть определено свойство $_name.

php
$record = Table::getByName('John');

save


Сохранение записи. Метод принимает массив полей и возвращает идентификатор сохранённой записи.

php
$id = Table::save([Table::FIELD_NAME => 'John', Table::FIELD_STATUS => 1]);

Для таблиц с updated_at (DatabaseExtend) поле обновляется автоматически.

Создание собственных методов поиска


Помимо предопределённых методов, в классах DbTables можно создавать собственные методы для специфических запросов. Для этого используется getSelect(), который возвращает объект Select для построения запроса.

Пример из модуля Base:



php
public static function getByUid($label, $project = CURRENT_PROJECT)
{
    return (self::getSelect())
        ->addWhere([
            self::createWhere(self::PERSON_PRIVATE_UID, $label),
            self::createWhere(self::PROJECT_ID, $project)
        ])
        ->pop()
        ->result();
}

Разбор примера:

self::getSelect() - создаёт новый объект Select для текущей таблицы.

addWhere() - добавляет условия в запрос. Принимает массив условий, созданных через createWhere.

createWhere() - создаёт объект условия для поля. Вместо строковых названий полей используются константы полей.

pop() - указывает, что нужно вернуть одну запись вместо массива.

result() - выполняет запрос и возвращает результат.

Важно: во всех методах вместо строковых названий полей используются константы, определённые в классе DbTable. Это обеспечивает единообразие и упрощает рефакторинг.

Другие примеры


Поиск по нескольким условиям с LIKE:



php
public static function getBySearch($search)
{
    return (self::getSelect())
        ->addWhere([
            self::createWhere(self::FIELD_NAME, $search, Where::LIKE),
            self::createWhere(self::FIELD_STATUS, 1)
        ])
        ->result();
}

Поиск с сортировкой:



php
public static function getActiveSorted()
{
    return (self::getSelect())
        ->addWhere(self::createWhere(self::FIELD_STATUS, 1))
        ->order(self::FIELD_SORT)
        ->result();
}

Поиск с пагинацией:



php
public static function getByPage($page)
{
    return (self::getSelect())
        ->addWhere(self::createWhere(self::FIELD_STATUS, 1))
        ->page($page)
        ->result();
}

Поиск с возвратом массива вместо модели:



php
public static function getListAsArray()
{
    self::setModelResponse(false);
    return (self::getSelect())
        ->addWhere(self::createWhere(self::FIELD_STATUS, 1))
        ->result();
}

Методы работы с объектом Select


Методы getRow, getAll, getByCondition используют объект Select для построения запросов. Select можно получить явно через метод getSelect.

php
$select = Table::getSelect();
$select->addWhere(Table::createWhere(Table::FIELD_STATUS, 1));
$records = $select->result();

Цепочка вызовов


Методы поддерживают цепочку вызовов для построения запросов.

php
$records = Table::getSelect()
    ->addWhere(Table::createWhere(Table::FIELD_STATUS, 1))
    ->order(Table::FIELD_NAME)
    ->page(2)
    ->result();

Кеширование


Методы поддерживают кеширование через параметр $cache.

php
$record = Table::getRow($id, false, false, true, true);  // с кешем
$record = Table::getRow($id, false, false, true, false); // без кеша

Режимы работы


Методы управления режимами работы позволяют временно изменять поведение ORM для текущего запроса. После выполнения запроса все флаги автоматически возвращаются в базовое состояние.

Это гарантирует, что изменение режима работы для одного запроса не повлияет на последующие операции.

setModelResponse


Управляет форматом возвращаемых данных.

true - возвращаются модели

false - возвращаются массивы

php
Table::setModelResponse(false);
$records = Table::getAll(); // вернёт массивы

После выполнения запроса режим возвращается к значению по умолчанию (true).

setIgnoreExtend


Отключает фильтрацию по deleted_at для таблиц с soft delete. Позволяет получить удалённые записи.

php
Table::setIgnoreExtend(true);
$records = Table::getAll(); // включает удалённые записи

После выполнения запроса флаг сбрасывается в false.

setIgnoreProject


Отключает фильтрацию по project_id. Позволяет получить записи всех проектов.

php
Table::setIgnoreProject(true);
$records = Table::getAll(); // включает записи всех проектов

После выполнения запроса флаг сбрасывается в false.




Что дальше?



- ➡️ Раздел 18. Использование JOIN
- ➡️ Раздел 19. Модели
- ➡️ Раздел 20. JSON-данные