ORM phpActiveRecord. Практика

Документация у этой ORM ужасная! При этом не всегда соответствует stable версии, поэтому стоит использовать AR с репозитория.
На сайте по форуму даже поиска нет, тут гугл приходит на помощь: поиск по форуму phpActiveRecord. Форум вообще больше похож на тикеты, которыми пользоваться крайне не удобно.

Подключение и настройка

Инициализация подключения к БД

ActiveRecord\Config::initialize(function($cfg) {
  /* @var $cfg ActiveRecord\Config */
  $cfg->set_model_directory('models');
  $cfg->set_connections(array(
    'dev' => 'mysql://local:local@localhost/proxy;charset=utf8'
  ), 'dev'); // соединение по умолчанию
});
Entity — это сущность (модель) с которой нужно оперировать. По всему документу в примерах я буду использовать это абстрактное название объекта.

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

Поля с типом timestamp ActiveRecord представляет в виде объекта ActiveRecord\DateTime.

Проверить существование записи по ID (по первичному ключу):

$row_exists = Entity::exists($id);

Получить запись по условию:

// Получить запись по PK (обычно это id)
$oRow = Entity::find(4, array('select' => 'id as entity_id, name'));
// SELECT id as entity_id, name FROM entity WHERE id = 4
В примере ниже — два идентичных запроса, лишь с той разницей, что в первом, при наличии одной найденной записи — мы получаем Model (объект), а не массив моделей. Во втором — мы всегда будем получать массив моделей.
$ids = array(1,2,3);
$mix = Entity::find($ids, array(
  'select' => 'host, port, type, user, pass'
));
if (is_object($mix)) {
  $mix = array($mix);
}

$array = Entity::find('all', array(
  'select'     => 'host, port, type, user, pass',
  'conditions' => array('id in(?)', $ids)
));
// SELECT host, port, type, user, pass FROM entity WHERE id IN (1,2,3)

Можно проще. Всегда возвращает массив:

$array = Proxy::find_by_id(array(1,2,3));
// SELECT * FROM `proxy` WHERE `id` IN(?,?,?) LIMIT 0,1

$array = Proxy::find_all_by_id(array(1,2,3));
// SELECT * FROM `proxy` WHERE `id` IN(?,?,?)

Динамические условия

Если запись не найдена — вернет NULLModel

$oRow = Entity::find_by_country_name_or_code('Ukraine', 'UA');
// SELECT * FROM entity WHERE country_name = 'Ukraine' OR code = 'UA';
$array = Entity::find_all_by_name_and_email('User', 'email@domain.com');
// SELECT * FROM entity WHERE name = 'User' AND email = 'email@domain.com';

$int = Entity::count_by_email('email@domain.com');

Получить массив атрибутов

$array = Entity::find(4)->attributes();

Получить единственное поле

$num_rows = $connection->query_and_fetch_one('SELECT FOUND_ROWS()');

Опции запросов

Полный перечень доступных опций запроса: conditions, limit, offset, order, select, joins, include, readonly, group, from, having.

Добавление, обновление данных

Найти или создать, если запись не существует

Entity::find_or_create_by_name_and_id('Name', 123);
Entity::find_or_create_by_name_and_id(array('name' => 'Name', 'id' => 123));

Добавить запись из массива:

$data = array('name' => 'ActiveRecord', 'type' => 'ORM');
$oRow = Entity::create($data);

Создать экземпляр записи и сохранить

$oRow = new Entity();
$oRow->name = 'ActiveRecord';
$oRow->type = 'ORM';
if ($oRow->save()) {
  echo "Успешно";
}

SQL Builder

Инициализация

$connection = ActiveRecord\ConnectionManager::get_connection('connection_name');
$sql = new ActiveRecord\SQLBuilder($connection, 'table_name');
$sql->where('id in(?)', array(1,3,6));
$sql->where(array('id in(?)' => array(1,3,6)));
$sql->where('stage_id in (1,3,6)');

Обработка ошибок

Получить все ошибки модели

$oRow = new Entity(array('field' => 'value'))->save();
$aErr = $oRow->errors->full_messages();

Получить последний запрос

$connection = ActiveRecord\ConnectionManager::get_connection();
echo $connection->last_query;
Параметры запроса получаем отдельно