Skip to content
Anton edited this page Oct 18, 2013 · 16 revisions

Описание

Аналогично Zend_Db_Table, связи не поддерживаются

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

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

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

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

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

SELECT * FROM %%table%%

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

<?php
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:

<?php
$row = Pages\Table::create();

insert($data)

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

update($data, $where)

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

<?php
Pages\Table::update(['userId' => 12], ['userId' => 13, 'status' => 'public']);

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

delete

<?php
Pages\Table::delete(['userId' => 13, 'status' => 'public']);

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

fetch

fetchAll

Поиск по primary key

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

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

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

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

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

<?php
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:

<?php
// 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]);

Select builder

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

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