Db Table
Описание
Класс, который необходим для полноценной работы 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:
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();