Skip to content
Anton edited this page Dec 15, 2016 · 16 revisions

Описание

Класс, который необходим для полноценной работы Db\Row.

Почему данные методы не объеденены в Db\Row для получения полноценного Active Record? А у нас разделения труда, да и таблица статична, лишнего не кушает

Использование

Из обязательного - первичные ключи, опционально указываем имя таблицы и имя класса Db\Row (по умолчанию они вычисляются из имени класса, путём преобразования CamelCase в underscore)

namespace Application\Users;
class Table extends \Bluz\Db\Table
{ 
    /**
     * Table
     *
     * @var string
     */
    protected $name = 'users';
 
    /**
     * Primary key(s)
     * @var array
     */
    protected $primary = array('id');
 
}

Рекомендую указывать имя таблицы в явном виде, и наглядно и ресурсы не кушает

Если используете PostgreSQL то следует так же указать свойство $sequence

По умолчанию, запрос к БД для вытаскивания сущностей имеет следующий вид:

SELECT * FROM %%table%%

Его можно изменить переопределив select:

class Table extends \Bluz\Db\Table
{
    protected $select = "
    select
          users.*
        , g.name AS __groups_name
    from users
    left join groups g on users.group_id = g.id 
";
}

Манипуляции с данными

create()

Данный метод возвращает новый эксземпляр связанного Db\Row:

$row = Pages\Table::create();

insert($data)

В качестве параметра ожидает массив данных в формате ключ-значение, возвращает lastInsertId

// INSERT INTO `pages` SET `userId` = 12, `status` = 'public', `title` = 'example'
$primary = Pages\Table::insert(['userId' => 12, 'status' => 'public', 'title' => 'example']);

update($data, $where)

В качестве параметров ожидает массив данных в формате ключ-значение и массив условий для построения условия WHERE

// UPDATE `pages` SET `userId` = 12 WHERE `userId` = 13 AND `status` = 'public'
Pages\Table::update(['userId' => 12], ['userId' => 13, 'status' => 'public']);

Если параметр $where окажется пуст, то словите Exception

delete($where)

Удаляем записи:

// DELETE FROM `pages` WHERE `userId` = 13 AND `status` = 'public'
Pages\Table::delete(['userId' => 13, 'status' => 'public']);

Если параметр $where окажется пуст, то словите Exception

fetch($sql, $params)

Получение выборки по SQL запросу, параметры в данном случае это значения для подстановки:

// SELECT * FROM `pages` WHERE `userId` = 13 AND `status` = 'public'
Pages\Table::fetch('SELECT * FROM `pages` WHERE `userId` = ? AND `status` = ?', [13, 'public']);

fetchAll()

Получение всех записей из таблицы, без условий и ограничений.

Будьте внимательней с данный методом

Поиск по primary key

Поиск по primary key осуществляется посредством метода find():

use Application\Users;
$users = Users\Table::find(123);
$users = Users\Table::find(123, 234, 345);

Для составных ключей следует использовать массивы:

use Application\Users;
$users = Users\Table::find([123, 'abc']);
$users = Users\Table::find([123, 'abc'], [234, 'def'], [345, 'ghi']);

Данный метод всегда возвращает Rowset, для поиска единственной Row следует использовать метод findRow

use Application\Users;
/**
 * @var Users\Row $user
 */
$user = Users\Table::findRow(123);
// compound primary key
$user = Users\Table::findRow([123,'abc']);

Поиск по условию

В довесок к методам find() и findRow() есть методы findWhere() и findRowWhere(), которые позволяют прописать условие WHERE:

// WHERE alias = 'foo'
Pages\Table::findWhere(['alias'=>'foo']);
// WHERE alias = 'foo' OR 'alias' = 'bar'
Pages\Table::findWhere(['alias'=>'foo'], ['alias'=>'bar']);
// WHERE alias IN ('foo','bar');
Pages\Table::findWhere(['alias'=> ['foo', 'bar']]);
// WHERE (alias = 'foo' AND userId = 2) OR ('alias' = 'bar' AND userId = 4)
Pages\Table::findWhere(['alias'=>'foo', 'userId'=> 2], ['alias'=>'foo', 'userId'=>4]);
// WHERE alias IS NULL
Pages\Table::findWhere(['alias'=>null]);

Если параметры для условия не передать - словите Exception

Select builder

Ещё один способ получить необходимой набор записей - использование конструктор запросов Db Query, но чтобы нам не надо было производить лишние махинации над ним, объект Db\Table уже имеет метод select(), который вернёт нам конструктор с предустановленным select($alias.'.*'), from($tableName) и setFetchType($rowClass):

// WHERE p.id = 42
Pages\Table::select()->where('p.id = ?', 42)->execute();
Clone this wiki locally