Для выборки сущностей из базы данных, следует воспользоваться классом RS::Orm::Request. Данный класс позволяет конструировать запрос к базе данных из частей, схожих по именованию с инструкциями SQL. Результатом выборки может быть как массив массивов, так и массив ORM-объектов(используется гораздо чаще).
Преимущество конструктора запроса в виде объекта заключается в том, что его можно передавать по ссылке и без особых сложностей изменять или дополнять нужную часть запроса.
Чтобы создать экземпляр класса, можно воспользоваться как ключевым словом new, так и вызвать статический метод RS::Orm::Request::make(). Второй вариант позволяет сконструировать и запустить запрос в одну строку.
$q = new \RS\Orm\Request();
$result = $q->select()
            ->from(new \Catalog\Model\Orm\Product)
            ->objects();
echo $q; 
                ->select()
                ->from(new \Catalog\Model\Orm\Product)
                ->objects();
Построение запроса 
Каждый из методов построения запроса дополняет запрос соответствующей секцией и возвращает объект самого себя в качестве результата, что позволяет строить цепочку из методов.
select 
RS::Orm::Request::select - Заполняет секцию SELECT у SQL запроса. 
echo  \RS\Orm\Request::make()
        ->select('title', 'alias')
        ->from(new \Catalog\Model\Orm\Product);
echo  \RS\Orm\Request::make()
        ->select('title')
        ->select('alias') 
        ->from(new \Catalog\Model\Orm\Product);
echo  \RS\Orm\Request::make()
        ->select('COUNT(*)') 
        ->from(new \Catalog\Model\Orm\Product);
update и set 
RS::Orm::Request::update - Заполняет секцию UPDATE у SQL запроса
RS::Orm::Request::set - Заполняет секцию SET у SQL запроса
echo  \RS\Orm\Request::make()
        ->update(new \Catalog\Model\Orm\Product)
        ->set(array(
            'title' => 'Новое название'  
        ))
        ->where(array('id' => 5));
        
echo  \RS\Orm\Request::make()
        ->update(new \Catalog\Model\Orm\Product)
        ->set("title = alias, barcode='12345'")  
        ->where(array('id' => 5));
        
delete 
RS::Orm::Request::delete - Заполняет секцию DELETE у SQL запроса
echo  \RS\Orm\Request::make()
        ->delete(new \Catalog\Model\Orm\Product)
        ->from(new \Catalog\Model\Orm\Product, 'P')
        ->from(new \Catalog\Model\Orm\Dir, 'D')
        ->where('D.id = P.maindir')
        ->where(array(
            'D.dir_id' => '1'
        ));
           FROM `readyscript`.`prefix_product` as P, 
                `readyscript`.`prefix_product_dir` as D 
           WHERE 
                D.id = P.maindir
                AND (`D`.`dir_id` = '1')
echo  \RS\Orm\Request::make()
        ->delete()
        ->from(new \Catalog\Model\Orm\Product)
        ->where(array(
            'id' => '1'
        ));
from 
RS::Orm::Request::from - Заполняет секцию FROM у SQL запроса
echo  \RS\Orm\Request::make()
        ->from(new \Catalog\Model\Orm\Product, 'P') 
        ->from('`readyscript`.`prefix_product_dir` as D') 
        ->where('D.id = P.maindir');
 
join 
RS::Orm::Request::join - Заполняет секцию JOIN у SQL запроса
echo  \RS\Orm\Request::make()
        ->from(new \Catalog\Model\Orm\Product, 'P') 
        ->join(new \Catalog\Model\Orm\Dir, 'D.id = P.maindir', 'D')
        ->join(new \Catalog\Model\Orm\Unit, 'U.id = P.unit', 'U')
        ->where(array(
            'P.id' => 1
        ));
echo  \RS\Orm\Request::make()
        ->from(new \Catalog\Model\Orm\Product, 'P') 
        ->join(new \Catalog\Model\Orm\Dir, 'D.id = P.maindir', 'D', 'LEFT')
        ->where(array(
            'P.id' => 1
        ));
leftJoin 
RS::Orm::Request::leftjoin - Вызывает метод join с заранее установленным типом - LEFT
echo  \RS\Orm\Request::make()
        ->from(new \Catalog\Model\Orm\Product, 'P') 
        ->leftjoin(new \Catalog\Model\Orm\Dir, 'D.id = P.maindir', 'D')
        ->leftjoin(new \Catalog\Model\Orm\Unit, 'U.id = P.unit', 'U')
        ->where(array(
            'P.id' => 1
        ));
where 
RS::Orm::Request::where - Заполняет секцию WHERE у SQL запроса
echo  \RS\Orm\Request::make()
        ->select('*')
        ->from(new \Catalog\Model\Orm\Product, 'P') 
        ->from(new \Catalog\Model\Orm\Dir, 'D') 
        ->where("D.id = P.maindir AND (P.id='#id' OR P.title='#title')",   
            array(
                'id' => 1, 
                'title' => 'Монитор'
            )
        );
echo  \RS\Orm\Request::make()
        ->select('*')
        ->from(new \Catalog\Model\Orm\Product, 'P') 
        ->from(new \Catalog\Model\Orm\Dir, 'D') 
        ->where(array(
            'maindir' => 1
        ))
        ->where(
            array(
                'id' => 1, 
                'title' => 'Монитор'
            ), 
            null, 
            'AND',   
            'OR'     
        );        
whereIn 
RS::Orm::Request::whereIn - Заполняет секцию WHERE ... IN () у SQL запроса
echo  \RS\Orm\Request::make()
        ->select('*')
        ->from(new \Catalog\Model\Orm\Product) 
        ->whereIn('id', array(1,2,3,4,5));
openWGroup и closeWGroup 
RS::Orm::Request::openWgroup - Добавляет открывающую скобку для группировки условий
RS::Orm::Request::closeWGroup - Добавляет закрывающую скобку для группировки условий
echo  \RS\Orm\Request::make()
        ->select('*')
        ->from(new \Catalog\Model\Orm\Product) 
        ->where(array('maindir' => 1))
        ->openWGroup('AND')
            ->where("title = '#title' OR id = '#id'", array(
                'title' => 'Моноблок',
                'id' => 1
            ))
        ->closeWGroup();
offset 
RS::Orm::Request::offset - Устанавливает offset для LIMIT offset, limit у SQL запроса
echo  \RS\Orm\Request::make()
        ->select('*')
        ->from(new \Catalog\Model\Orm\Product) 
        ->offset(5)
        ->limit(3);
echo  \RS\Orm\Request::make()
        ->select('*')
        ->from(new \Catalog\Model\Orm\Product) 
        ->limit(5, 3);
limit 
RS::Orm::Request::limit - Заполняет секцию LIMIT у SQL запроса
echo  \RS\Orm\Request::make()
        ->select('*')
        ->from(new \Catalog\Model\Orm\Product) 
        ->limit(5);
echo  \RS\Orm\Request::make()
        ->select('*')
        ->from(new \Catalog\Model\Orm\Product) 
        ->limit(3, 5);
orderby 
RS::Orm::Request::orderby - Заполняет секцию ORDER BY у SQL запроса
echo  \RS\Orm\Request::make()
        ->select('*')
        ->from(new \Catalog\Model\Orm\Product)
        ->orderby('maindir, title');
groupby 
RS::Orm::Request::groupby - Заполняет секцию GROUP BY у SQL запроса
echo  \RS\Orm\Request::make()
        ->select('title, COUNT(title)')
        ->from(new \Catalog\Model\Orm\Product) 
        ->groupby('title');
having 
RS::Orm::Request::having - Заполняет секцию HAVING у SQL запроса
echo  \RS\Orm\Request::make()
        ->select('title, COUNT(title)')
        ->from(new \Catalog\Model\Orm\Product)
        ->groupby('title')
        ->having("COUNT('title') = 1");
Просмотр текущего состояния объекта 
Текущее состояние различных секций запроса можно узнавать, обращаясь к соответствующему свойству объекта:
- select
 
- delete
 
- having
 
- groupby
 
- from
 
- joins
 
- where
 
- limit
 
- offset
 
- orderby
 
- set
 
Присваивая свойству null, можно сбрасывать значение секции.
        ->select('title, COUNT(title)')
        ->from(new \Catalog\Model\Orm\Product) 
        ->where(array(
            'id' => 1
        ))
        ->groupby('title');
echo $q->select; 
echo $q->where; 
echo $q->groupby; 
$q->groupby = null; 
 
Выполнение запроса. Получение результата 
Чтобы получить результат в виде массива объектов, необходимо вызвать метод RS::Orm::Request::objects(). Метод имеет следующие аргументы:
- $class_name - object или string, необязательный. Задает класс возвращаемых объектов. Если аргумент не задан, то будет возвращен список из объектов класса, который был указан в последней секции from.
 
- $key - string, необязательный. Задает поле, значение которого пойдет в ключ массива. Если не задано, то будет создан нумерованный массив.
 
- $allow_sublist - bool, необязательный, по умолчанию - false. Имеет значение, если задан $key. Если указать true, то результат будет возвращен в виде ['key' => [object, object,...], 'key' => [object, object,...], иначе результат будет возвращен в виде ['key' => object, 'key' => object]
 
                        ->from(new \Catalog\Model\Orm\Product) 
                        ->objects();
                        ->from(new \Catalog\Model\Orm\Product, 'P')
                        ->from(new \Catalog\Model\Orm\Dir, 'D')
                        ->where('D.id = P.maindir')
                        ->objects(new \Catalog\Model\Orm\Product); 
 Метод RS::Orm::Request::exec() выполняет запрос к базе данных и возвращает результат в виде объекта RS::Db::Result. Объект RS::Db::Result содержит указатель на ресурс результата запроса к MySQL, а также ряд методов по извлечению из него данных.
                        ->from(new \Catalog\Model\Orm\Product) 
                        ->exec();
echo 'Всего строк:'.$result_resource->rowCount();
while($row = $result_resource->fetchRow()) {
    var_dump($row); 
}
 Чтобы выполнить запрос и вернуть первый объект из списка, следует использовать метод Метод RS::Orm::Request::object(). Метод имеет следующие аргументы:
- $class_name - object или string, необязательный. Задает класс возвращаемых объектов. Если аргумент не задан, то будет возвращен список из объектов класса, который был указан в последней секции from.
 
                ->from(new \Catalog\Model\Orm\Product)
                ->where(array('id' => 1))
                ->object();
                ->from(new \Catalog\Model\Orm\Product, 'P') 
                ->from(new \Catalog\Model\Orm\Dir, 'D')
                ->where('D.id = P.maindir')
                ->where(array(
                    'P.id' => 1
                ))
                ->object(new \Catalog\Model\Orm\Product);