# Руководство по работе с коннектором tarantool-php ## Содержание 1. [Подготовка](#Подготовка) 2. [Подключение к Tarantool](#Подключение-к-Tarantool) 3. [Работа с данными](#Работа-с-данными) 1. [Вставка данных](#Вставка-данных) 2. [Получение данных](#Получение-данных) 3. [Обновление данных](#Обновление-данных) 4. [Удаление данных](#Удаление-данных) 4. [Исполнение хранимых процедур](#Исполнение-хранимых-процедур) ## Подготовка Перед началом работы [установим](https://github.com/tarantool-php/client#installation) библиотеку `tarantool-php`. Также запустим `tarantool` и обязательно выполним пункт с созданием базы данных, как показано [здесь](https://www.tarantool.io/ru/doc/1.10/book/getting_started/). Если вы используете бинарный пакет `tarantool` (не Docker-образ), то не закрывайте консоль, в которой запущен `tarantool` -- она пригодится нам позднее. Чтобы иметь возможность подключаться к `tarantool` в качестве администратора, сменим пароль пользователя `admin`: ```lua box.schema.user.passwd('pass') ``` ## Подключение к Tarantool Для подключения к серверу достаточно выполнить следующее: ```php require_once __DIR__.'/vendor/autoload.php'; use Tarantool\Client\Client; $client = Client::fromDefaults(); ``` Также при необходимости можно указать имя пользователя и пароль: ```php $client = Client::fromOptions([ 'uri' => 'tcp://127.0.0.1:3301', 'username' => '<username>', 'password' => '<password>' ]); ``` По умолчанию используется пользователь `guest`. ## Работа с данными Спейс -- это контейнер для кортежей. Чтобы обратиться к спейсу как к именованному объекту, можно воспользоваться функцией `connection.space`. ```php $tester = $client->getSpace('tester'); ``` ### Вставка данных Для вставки нового кортежа в спейс воспользуемся функцией `insert`: ```php $result = $tester->insert([4, 'ABBA', 1972]); ``` ### Получение данных Сначала выберем кортеж по первичному ключу (в нашем примере первичный индекс -- это индекс `primary`, построенный по полю `id` в каждом кортеже). Воспользуемся функцией `select`: ```php use Tarantool\Client\Schema\Criteria; $result = $tester->select(Criteria::key([4])); printf(json_encode($result)); ``` ``` [[4, 'ABBA', 1972]] ``` Теперь поищем кортежи по вторичному ключу. Для этого нужно указать номер или имя вторичного индекса. Сначала сделаем запрос по номеру индекса: ```php $result = $tester->select(Criteria::index(1)->andKey(['Scorpions'])); printf(json_encode($result)); ``` ``` [2, 'Scorpions', 2015] ``` Теперь сделаем аналогичный запрос по имени индекса и получим тот же результат: ```php $result = $tester->select(Criteria::index('secondary')->andKey(['Scorpions'])); printf(json_encode($result)); ``` ``` [2, 'Scorpions', 2015] ``` А чтобы выбрать все кортежи из спейса, вызовем `select` без аргументов: ```php $result = $tester->select(Criteria::AllIterator()); ``` ### Обновление данных Обновим значение поля с помощью `update`: ```php use Tarantool\Client\Schema\Operations; $result = $tester->update([4], Operations::set(1, 'New group')->andAdd(2, 2)); ``` Здесь мы обновляем значение поля `1` и увеличиваем значение поля `2` для кортежа с `id` = 4. Если кортежа с таким `id` нет, то `tarantool` вернет ошибку. Теперь с помощью функции `replace` мы полностью заменим кортеж с совпадающим первичным ключом. Если кортежа с указанным первичным ключом не существует, то будет создан указанный кортеж. ```php $result = $tester->replace([4, 'New band', 2015]); ``` Также мы можем обновлять данные с помощью функции `upsert`, которая работает аналогично `update`, но создает новый кортеж, если старый не был найден. ```php use Tarantool\Client\Schema\Operations; $tester->upsert([4, 'Another band', 2000], Operations::add(2, 5)); ``` Здесь мы увеличиваем на 5 значение поля `2` в кортеже с `id` = 4 -- или вставляем кортеж `(4, "Another band", 2000)`, если такого нет. ### Удаление данных Чтобы удалить кортеж, нужно использовать `delete(primary_key)`: ```php $result = $tester->delete([4]); ``` Для удаления всех кортежей в спейсе (или всего спейса), нужно воспользоваться функцией `сall`. Мы поговорим о ней подробнее в [следующем](#Исполнение-хранимых-процедур) разделе. Чтобы удалить все кортежи в спейсе, нужно вызвать функцию `space:truncate`: ```php $result = $client->call('box.space.tester:truncate'); ``` Чтобы удалить спейс, необходимо вызвать функцию `space:drop`. Для выполнения следующей команды необходимо подключиться из-под пользователя `admin`: ```php $result = $client->call('box.space.tester:drop'); ``` ## Исполнение хранимых процедур Перейдем в терминал с запущенным `tarantool` (о том, как установить удаленное подключение к `tarantool`, можно прочитать [здесь](https://www.tarantool.io/ru/doc/1.10/book/getting_started/using_binary/#connecting-remotely)) и напишем простую функцию на Lua: ```lua function sum(a, b) return a + b end ``` Чтобы вызвать из `php` функцию, описанную в `tarantool`, нам нужна функция `call`: ```php $result = $client->call('sum', 3, 2); ``` Также мы можем передать Lua-код на выполнение. Для этого воспользуемся функцией `evaluate`: ```php $result = $client->evaluate('return 4 + 5'); ```