Приклади побудови запитів з RedBeanPHP


Хто слідкує за моїм блогом, той вже в курсі про RedbeanPHP і читав про переваги та основи роботи з цією ORM. Цього разу я опишу додаткові можливості RedbeanPHP, які в деяких випадках можуть значно спростити життя програміста.

Звичайні запити

Якщо вам потрібно виконати звичайний запит напряму, то це можна дуже просто зробити:
R::exec('UPDATE contact SET age=23 WHERE id=2');
Тут, і у поданих нижче прикладах, дані можна “біндити” наступним чином:
R::exec(
    'UPDATE contact SET age=23 WHERE name LIKE ?',
    array('%Тарас%')
);
або так:
R::exec(
    'UPDATE contact SET phone=:phone WHERE id=:id',
    array(':phone' => '234-56-78', ':id' => 2)
);
Метод exec() дозволяє фактично напряму в СУБД писати будь-які запити, екранує дані, і в рeзультаті повертає кількість оновлених (видалених, вибраних) рядків.

Також, якщо у якомусь випадку потрібно просто витягнути дані у масив без прив’язки до об’єктів, чи просто буває зручніше написати прямий запит, то це можна зробити наступним чином:

1) вибірка кількох рядків у багатовимірний масив (масив записів, які в свою чергу теж є масивами):
R::getAll('SELECT * FROM contact WHERE age > 20');

array[
    0 => array[ /* рядок в БД */ ]
    1 => array[ /* рядок в БД */ ]
    ...
]
2) вибірка одного рядка у масив:
R::getRow('SELECT * FROM contact WHERE phone="234-56-78" LIMIT 1');

array[
    'id' => 2
    'name' => 'Тарас Романів'
    ...
]
3) вибірка одного стовпця у масив:
R::getCol('SELECT DISTINCT age FROM contact');

array[
    0 => 20
    1 => 22
    ...
]
4) вибірка однієї клітинки у звичайну змінну:
R::getCell('SELECT age FROM contact WHERE id=2 LIMIT 1');

'int' 23
5) вибірка двох заданих стовпців у асоціативний масив (зручно формувати дані для <select>…</select>, тощо):
R::getAssoc('SELECT phone, name FROM contact WHERE age>22');

array[
    '234-56-78' => 'Тарас Романів'
    '345-67-89' => 'Ларі Пейдж'
    ...
];

Суміш PHP та SQL

В RedbeanPHP можна зручно поєднувати PHP та SQL код.  Якщо нам потрібно виконати SQL-функцію, чи побудувати іншу конструкцію, то необов’язково вручну писати запит. Це можна зробити наступним чином:
$time = R::$f->now(); // аналогічно до "SELECT NOW();"
Крім таких простих конструкцій,  можна будувати і значно складніші запити прямо в себе в коді. Де буває корисним для побудови динамічних запитів, тобто таких, що можуть змінювати свою структуру за певних умов. Отож:
$contact = R::$f->begin()
->select('*')->from('contact')
->where('id = ?')->put(2)->get('row');
// аналогічно до "SELECT * FROM contact WHERE id=2;"
Звичайно, на перший погляд ця контрукція здається громіздкою, але з іншого боку вона є досить гнучкою, і надає цим самим додаткові можливості програмістові.

Транзакції

Ну і звичайно,  в RedbeanPHP є підтримка транзакцій. Вони реалізовуться за допомогою методів begin(), commit(), rollback() наступим чином:
R::begin();
try {
    R::store($contact);
    R::commit();
} catch(Exception $e) {
    R::rollback();
}
Дякую за увагу! Сподіваюсь, матеріал був корисним для вас.

Коментарі

Популярні дописи з цього блогу

Колір в CSS

Комунікація між вкладками браузера

Порівняння швидкодії PHP-фреймворків