---
# System prepended metadata

title: Руководство по работе с коннектором tarantool-php

---

# Руководство по работе с коннектором tarantool-php

## Содержание

1. [Подготовка](#Подготовка)
2. [Подключение к Tarantool](#Подключение-к-Tarantool)
3. [Получение схемы данных](#Получение-схемы-данных)
4. [Работа с данными](#Работа-с-данными)
	1. [Вставка данных](#Вставка-данных)
	2. [Получение данных](#Получение-данных)
	3. [Обновление данных](#Обновление-данных)
	4. [Удаление данных](#Удаление-данных)
5. [Исполнение хранимых процедур](#Исполнение-хранимых-процедур)

## Подготовка

Перед началом работы [установим](https://github.com/tarantool/tarantool-python#download-and-install) библиотеку `tarantool-php`.

Также запустим `tarantool` и создадим тестовую базу, как показано [здесь](https://www.tarantool.io/ru/doc/2.2/book/getting_started/using_binary/#creating-a-database).

Чтобы предоставить пользователю `guest` права на удаление спейса, выполним следующую команду в консоли `tarantool`:

```lua
tarantool> box.schema.user.grant('guest', 'drop', 'space', 'tester')
```

## Подключение к 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`.

## Получение схемы данных

Обратиться к схеме БД можно так:

```php
use Tarantool\Client\Schema\Space;

$schema = $client->getSpace(Space::VSPACE_ID);
```

А получить информацию об отдельном спейсе -- вот так:

```php
$space_data = schema->select(Criteria::key(["tester"])->andIndex(Space::VSPACE_NAME_INDEX));
```

## Работа с данными

Спейс -- это контейнер для кортежей. Чтобы обратиться к спейсу как к именованному объекту, можно воспользоваться функцией `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` мы полностью заменим кортеж с совпадающим первичным ключом. Если кортежа с указанным первичным ключом не существует, то `tarantool` опять же вернет ошибку.

```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]);
```
    
Чтобы удалить все кортежи в спейсе, нужно вызвать функцию `space:truncate`:

```php
$result = $client->call('box.space.tester:truncate');
```

Чтобы удалить спейс, необходимо вызвать функцию `space:drop`:

```php
$result = $client->call('box.space.tester:drop');
```

## Исполнение хранимых процедур

Перейдем в терминал с запущенным `tarantool` (предполагается, что консоль, из которой был запущен `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');
```
