Skip to content
Oleg Grigoriev edited this page Mar 27, 2016 · 5 revisions

Table: доступ к таблице

Небольшая абстракция над таблицами.

DB::getTable(string $tablename):Table

Возвращает объект, связанный с указанной таблицей.

$users = $db->getTable('users'); // Надстройка над таблицей `users`

Учитываются префиксы:

$db->setPrefix('prefix_');
$users = $db->getTable('users'); // Надстройка над `prefix_users`

Объекты кэшируются:

$users = $db->getTable('users');
$users === $db->getTable('users'); // true

Библиотека никоим образом не проверяет существование таблицы:

$table = $db->getTable('nonexistent'); // ok

$table->select(); // здесь уже ошибка в запросе

getTableName(void):string, getDB(void):DB

$table = $db->getTable('test');
$table->getTableName(); // test
$table->getDB(); // $db

insert(array $set):int

Вставляет строку, возвращает автоинкремент, если есть.

$set = [
    'name' => 'Вася',
    'email' => 'vasa@vasa.loc',
];
$id = $table->insert($set);

Пустой массив $set не приводит к ошибке. Просто ничего не происходит и возвращается NULL.

multiInsert(array $sets [, bool $imp = true]):void

Вставляет сразу несколько строк.

$sets = [
    ['name' => 'Вася', 'email' => 'vasa@vasa.loc'],
    ['name' => 'Петя', 'email' => 'peta@peta.loc'],
    ['name' => 'Гриша', 'email' => 'grisha@grisha.loc'],
];
$table->multiInsert($sets);

Если база данных поддерживает расширенный формат вставки (INSERT INTO ... VALUES (..), (..), (..)), то используется он (например, в MySQL). Если нет (например, SQLite) - в цикле вызывается insert().

Но, так как библиотека никак не определяет возможности текущего движка БД, то придётся вручную передать аргумент $imp. TRUE - расширенная вставка реализована, FALSE - нет.

replace($set), multiReplace($sets, $imp).

Выполняют REPLACE INTO. Полностью аналогичны insert() и multiInsert().

update(array $set[, mixed $where]):int

Выполняет UPDATE.

Формат $where аналогичен плейсхолдеру ?w. По умолчанию обновляются все строки.

На выходе количество затронутых строк.

$table->update(['x' => 1], ['id' => 5]); // UPDATE `table` SET `x`=1 WHERE `id`=5

delete([mixed $where]):int

Удаляет строки. По умолчанию все.

Формат $where аналогичен плейсхолдеру ?w.

$table->delete(['id' => [1, 2, 3]]); // DELETE FROM `table` WHERE `id` IN (1, 2, 3)

Возвращает количество удалённых строк.

truncate(void)

Очищает таблицу. Не проверяет поддерживает или нет текущий движок эту команду.

getCount([$col [, $where]):int

Выполняет COUNT() на таблице.

$table->getCount(); // SELECT COUNT(1) FROM `table` - общее количество строк в таблице
$table->getCount('a'); // SELECT COUNT(`a`) ... - где a не NULL
$table->getCount(null, ['x' => 1]); // количество строк, где `x`=1

select($cols, $where, $order, $limit):Result

Все параметры не обязательны.

$table->select(); // выбор всего в неизвестном порядке
$table->select('a', ['id' => 5]); // SELECT `a` FROM `table` WHERE `id`=5
$table->select(['a', 'b'], ['id' => [1, 2]]); // SELECT `a`,`b` FROM `table` WHERE `id` IN (1, 2)

$cols - см. формат COLS.

$where - см. формат WHERE.

$order - массив: столбец => TRUE (ASC), FALSE (DESC) или имя столбца для ASC:

$table->select($cols, $where, 'col'); // ... ORDER BY `col` ASC
$table->select($cols, $where, ['a' => true, 'b' => false]); // ... ORDER BY `a` ASC, `b` DESC

$limit: скаляр или массив [$offset, $limit]:

$table->select($cols, $where, $order, 5); // ... LIMIT 0, 5
$table->select($cols, $where, $order, [5, 10]); // ... LIMIT 5, 10

P.S.

Во всех значениях null приводится к NULL, а не к 0 или пустой строке.

См. также

FakeTable.

Clone this wiki locally