В новом проекте поработал с ORM RedBeanPHP. Впечатления остались самые положительные, поэтому оставлю тут несколько заметок, по использованию. По сути, это будут примеры использования RedBeanPHP.
Примеры использования ORM RedBeanPHP
18.12.2021
Сам проект на github: redbean, и ссылка на api.
Установка
Есть возможность скачать руками, но я использовал composer:
composer require gabordemooij/redbean:dev-master
После этого подключаем autoload и добавляем R, как короткую ссылку для удобства:
require_once(__DIR__.'/vendor/autoload.php'); use \RedBeanPHP\R as R;
Настройка
R::setup( 'mysql:host=localhost;dbname=DB_NAME','DB_USER', 'DB_PASSWORD', false);
// Проверка подключения к БД
if(!R::testConnection()) die('No DB connection!');
Добавляем в таблицу новую запись
$oTest1 = R::dispense('test1');
$oTest1->title = 'ИМЯ';
$oTest1->text = Текст';
$oTest1->published = 1;
$id = R::store( $oTest1 );
echo $id . '<br />';
test1 (dispense('test1');) - это имя таблицы в БД.
Загружаем
$oTest2 = R::load('test1', 6);
echo '<pre>';
print_r($oTest2);
echo '</pre>';
Обновляем
$oTest2 = R::load('test1', 6);
$oTest2->title = '--!--';
$id = R::store( $oTest2 );
echo $id . '<br />';
Выборка
Допустим, нужно выбрать опубликованные записи с id 1,3 и 5:
// Поиск
$ids = [1, 3, 5];
//echo R::genSlots($ids). '<br />';
$aRows = R::find('test1', 'id IN (' . R::genSlots($ids) . ') AND published = 1', $ids);
echo '<pre>';
print_r($aRows);
echo '</pre>';
foreach($aRows as $oRow)
{
echo $oRow->title . '<br />';
}
echo '<hr />';
// Если одну из записей нужно еще и обновить:
$oRow = $aRows[5]; // Тут ID, а не порядковый номер!
$oRow->text = 'TfTfTf';
$id = R::store( $oRow );
echo $id . '<br />';
Выборка по полному запросу
$aRows = R::getAll("SELECT * FROM test1");
echo '<pre>';
print_r($aRows);
echo '</pre>';
на выходе получим просто массив:
Array
(
[0] => Array
(
[id] => 1
[title] => qqqqqqq
[text] => qqq qq qqq
[published] => 1
)
[1] => Array
(
[id] => 2
[title] => eeee
[text] => rrr rrr rr
[published] => 1
)
...
Если же нужно получить объекты, то используем convertToBeans:
$aRows = R::convertToBeans('test1', $aRows);
echo '<pre>';
print_r($aRows);
echo '</pre>';
на выходе:
Array
(
[1] => RedBeanPHP\OODBBean Object
(
[properties:protected] => Array
(
[id] => 1
[title] => qqqqqqq
[text] => qqq qq qqq
[published] => 1
)
...
Выборка из нескольких таблиц
$aRows = R::findMulti('test1,test2', ' SELECT test1.*, test2.* FROM test1, test2 WHERE test2.id = test1.id');
echo '<pre>';
print_r($aRows);
echo '</pre>';
Exec
Еще один интересный метод exec выполняет запрос и возвращает количество затронутых строк, хотя можно выполнить и SELECT :
$aRows = R::exec('SELECT * FROM test1 WHERE id = :id', [
'id' => 1,
]);
echo '<pre>';
print_r($aRows);
echo '</pre>';