Files
ave-cms/help/database/crud.md
T
2026-07-27 12:58:44 +03:00

3.4 KiB
Raw Blame History

CRUD-хелперы

Назад к разделу БД

Обёртки над INSERT/UPDATE/DELETE/REPLACE, которые сами экранируют данные — SQL руками писать не нужно. Данные передаются ассоциативным массивом колонка => значение.


INSERT

DB::Insert($table, $data)

Вставить строку. Возвращает результат запроса; ID берут отдельно через DB::insertId().

DB::Insert($t, array(
    'document_title' => 'Кресло-коляска',
    'rubric_id'      => 5,
    'document_status'=> '1',
));
$id = (int) DB::insertId();   // или DB::$insert_id

DB::insertIgnore($table, $data)INSERT IGNORE (не падать на дубле уникального ключа).

DB::Replace($table, $data)REPLACE INTO.


INSERT … ON DUPLICATE KEY UPDATE

DB::insertUpdate($table, $data, $update = null)

Вставить или обновить при конфликте уникального ключа. Если $update не задан — обновятся те же поля, что вставлялись (частый паттерн «upsert настройки/счётчика»).

DB::insertUpdate('counters',
    array('key' => 'views', 'value' => 1),
    array('value' => DB::sqlEval('value + 1'))   // при дубле — инкремент
);

UPDATE

DB::Update($table, $params, ...$where_args)

$params — что обновить (ассоц. массив), далее — условие с плейсхолдерами.

DB::Update($t, array('document_title' => 'Новый'), 'Id = %i', $id);

DB::Update($t,
    array('document_status' => '0', 'document_changed' => time()),
    'rubric_id = %i AND document_status = %s', 5, '1'
);

DELETE

DB::Delete($table, ...$where_args)

DB::Delete($t, 'Id = %i', $id);
DB::Delete($t, 'rubric_id = %i AND document_deleted = %s', 5, '1');

Условие обязательно — не забудьте WHERE, иначе удалите всё.


Пакетная вставка

insertOrReplace()Insert через него) принимает массив строк:

DB::insertOrReplace('INSERT', 'log', array(
    array('doc_id' => 1, 'msg' => 'a'),
    array('doc_id' => 2, 'msg' => 'b'),
));

Результат операций

DB::insertId();       // ID последней вставки
DB::affectedRows();   // сколько строк реально затронуто (UPDATE/DELETE)
DB::Update($t, array('x' => 1), 'id = %i', $id);
if (DB::affectedRows() === 0) { /* строка не найдена или значение не изменилось */ }

Рецепт: сохранить (создать или обновить)

public static function save($id, array $data)
{
    if ((int) $id > 0) {
        DB::Update(self::table(), $data, 'id = %i', (int) $id);
        return (int) $id;
    }
    DB::Insert(self::table(), $data);
    return (int) DB::insertId();
}

Для согласованности с бизнес-логикой (поисковый индекс, кеш документа) в контенте используйте методы моделей (Documents\Model::save), а не прямой DB::Update.