Skip to content

FakeTable

Oleg Grigoriev edited this page Feb 15, 2016 · 3 revisions

FakeTable

Тестовый "движок" таблицы. Работает с массивом в памяти.

Экземпляр Table может быть надстройкой над именем таблицы, тогда все запросы идут к БД. Либо надстройкой над FakeTable, тогда все запросы идут через неё.

FakeDB

Адаптер fake является фейковой базой данных. Единственный запрос, который он понимает: SHOW TABLES. На все остальные выкидывает эксепшн.

$db->getTable($name) возвращает фейковые таблицы. Их начальное состояние описывается в параметрах подключения.

$params = [
    '_adapter' => 'fake',
    'tables' => [
        'users' => [
            'data' => [
                ['id' => 1, 'email' => 'one@localhost', 'status' => 'active'],
                ['id' => 2, 'email' => 'two@localhost', 'status' => 'banned'],
            ],
            'defaults' => [
                'status' => 'active',
            ],
            'pk' => 'id',
            'lastAI' => true,
        ],
    ],
];

$db = \go\DB\DB::create($params);
$db->getTable('users')->select(['id', 'status'])->vars(); // 1 => active, 2 => banned

Обязательный параметр подключения - tables. Список таблиц в виде имя таблицы => параметры.

Список параметров дан ниже, единственный обязательный - data.

Получение через getTable()

$db->getTable($tableName);

Если вместо $tableName передан экземпляр FakeTable, то вне зависимости от адаптера базы, возвращается надстройка над этой таблицей.

Например, в конфиге какого-то модуля прописано имя таблицы, по которому в недрах этого модуля получается сама таблица.

$config = [
    // ...
    'table' => 'users',
];

// Внутри модуля:
$table = $this->db->getTable($this->config['table']);

Можно подменить таблицу, не влезая в код модуля, просто передав ему исправленный конфиг:

use go\DB\Fakes\FakeTable;

$fake = new FakeTable($data, $defaults, $pk, $lastAI);

$config = [
    // ...
    'table' => $fake,
];

Параметры таблицы

data

Список изначально существующих "записей" в таблице. Порядковый массив ассоциативных массивов.

Структура нигде не указывается. Если select() не находит в очередной записи нужного столбца, он возвращает NULL.

defaults

Если указан, то insert() и replace() берут отсюда значения по умолчанию для неуказанных полей.

pk

Первичный ключ. Строка (один столбец) или массив имён столбцов.

Используется для автоинкремента, для replace() и для проверки целостности после insert().

lastAI

Последний автоинкремент. NULL - нет автоинкремента. TRUE - берётся максимальное значение автоинкрементного столбца из data.

pk при этом должен содержать один столбец.

Методы FakeTable

Аналогичные Table:

  • insert(array $set): int
  • multiInsert(array $sets)
  • replace(array $set): int
  • multiReplace(array $sets)
  • update(array $set, mixed $where): int
  • select($cols, $where, $order, $limit): Result
  • delete($where): int
  • getCount($col, $where): int

"Транзакции":

  • begin()
  • commit()
  • rollback()

Информационные:

  • getData()
  • getLastIncrement()

Логи (в логи пишутся "запросы"):

  • getLogs(): string[]
  • resetLogs()
  • log(string $message) - добавить свой лог

Из FakeDB получить таблицы можно следующим способом:

$fakeEngine = $db->getImplementation();

$table = $fakeEngine->getTable('name');

$allTables = $fakeEngine->getListTables();
Clone this wiki locally