Skip to content
AntonShevchuk edited this page Oct 13, 2014 · 29 revisions

Описание

Строка в таблице, некий недо-ActiveRecord

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

Для корректной работы требует соответствующий класс Table

namespace Application\Users;
/**
 * @property integer $id
 * @property string $login
 * @property string $created
 * @property string $updated
 */
class Row extends \Bluz\Db\Row
{
}
 
$userRow = new \Application\Users\Row();
$userRow -> login = 'username';
$userRow -> save();

Аннотация в блоке комментариев необходимы лишь для поддержки автодополнения в IDE

Связанные записи

Данный функционал требует описание связей в соответствующей таблице, подробнее в статье Db-Relations

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

// query
$userRows = Users\Table::find(1, 2, 3);

// result
foreach($userRows as $userRow)
    $groupRow = $userRow->getRelation('Groups');

Хуки

В Row существуют следующие хуки:

  • afterRead() - после получения данных из БД
  • beforeSave() - до сохранения записи посредством insert или update
  • afterSave() - после
  • beforeInsert() - до сохранения записи посредством insert и после beforeSave
  • afterInsert() - после
  • beforeUpdate() - до сохранения записи посредством update и после beforeSave
  • afterUpdate() - после
  • beforeDelete() - до удаления записи
  • afterDelete() - после

Пример использования хуков:

namespace Application\Users;
/**
 * @property integer $id
 * @property string $login
 * @property string $created
 * @property string $updated
 */
class Row extends \Bluz\Db\Row
{
   public function beforeInsert()
   {
       $this->created = gmdate('Y-m-d H:i:s');
   }
   public function beforeUpdate()
   {
       $this->updated = gmdate('Y-m-d H:i:s');
   }
}

Валидация

с версии 0.4.3

Данные хуки так же следует использовать для проверки данных в Row, для этого достаточно генерировать исключение ValidatorException.

Так же можно использовать trait Validator\Trait\Validator, что упростит задачу по работе с ValidatorBuilder:

namespace Application\Pages;

use Bluz\Validator\Traits\Validator;
use Bluz\Validator\Validator as v;

class Row extends \Bluz\Db\Row
{
    use Validator;

    /**
     * {@inheritdoc}
     *
     * @return void
     */
    public function beforeSave()
    {
        // title validator
        $this->addValidator(
            'title',
            v::required()
        );

        // alias validator
        $this->addValidator(
            'alias',
            v::required(),
            v::slug(),
            v::callback(function ($input) {
                if ($row = $this->getTable()->findRowWhere(['alias' => $input])) {
                    if ($row->id != $this->id) {
                        return false;
                    }
                }
                return true;
            })->setError('Alias "{{input}}" already exists')
        );
    }
}

Clone this wiki locally