ORM: Изменить отметки времени "updated_at" родителя при обновлении модели в FuelPHP

Допустим, у меня есть Model_Post, который имеет_May Model_Comment.

Есть ли способ, которым updated_at поле Model_Post обновляется каждый раз при сохранении нового комментария? Я проверил документацию для наблюдателей, но я не могу найти, как это сделать "способом ORM".

Этот код не работает:

class Model_Comment extends \Orm\Model
{
    protected static $_properties = array(
        'id',
        'post_id',
        'text',

    );
    protected static $_belongs_to = array('post');
    protected static $_observers  = array(
        'Orm\\Observer_UpdatedAt' => array(
            'events'          => array('before_save'),
            'relations'       => array('post')
        )
    );
}

class Model_Post extends Model
{

    protected static $_properties = array(
        'id',
        'title',
        'text',
        'updated_at'
    );
    protected static $_has_many   = array('comments');
}

Я создаю новый комментарий, используя этот код:

$comment             = Model_Comment::forge();
$comment->message_id = Input::post('message_id');
$comment->text       = Input::post('text');
$comment->save();

3 ответа

Решение

Наконец, я нашел способ сделать это благодаря комментариям Uru.

Этот код работает сейчас, как я хотел; это было проще, чем я думал.

Модели:

class Model_Comment extends \Orm\Model
{
    protected static $_properties = array(
        'id',
        'post_id',
        'text',
    );
    protected static $_belongs_to = array('post');
}

class Model_Post extends \Orm\Model
{
    protected static $_properties = array(
        'id',
        'title',
        'text',
        'updated_at'
    );
    protected static $_has_many  = array('comments');
    protected static $_observers = array('Orm\Observer_UpdatedAt');
 }

И в контроллере:

$comment       = Model_Comment::forge();
$comment->text = Input::post('text');
$parent_post   = Model_Message::find(Input::post('post_id'));

$parent_post->comments[] = $comment;
$parent_post->save();

Вместо того, чтобы дурачиться с наблюдателями, видя, что вы хотите ORM-ориентированный подход, вы можете выбрать родительский объект, обновить его updated_at, а затем зафиксировать оба объекта в БД через ORM.

Однако вы не реализуете всю конфигурацию обозревателя:. Вам не хватает ключа свойства и ключа mysql_timestamp.

// Adding it with config:
// - only needs to run on before_save
// - use mysql timestamp (uses UNIX timestamp by default)
// - use just "updated" instead of "updated_at"
protected static $_observers = array(
    'Orm\\Observer_UpdatedAt' => array(
        'events' => array('before_save'),
        'mysql_timestamp' => true,
        'property' => 'updated',
        'relations' => array(
            'my_relation',
        ),
    ),
);

FuelPHP Observer_UpdatedAt

Если вы используете relations Свойство конфигурации наблюдателя вы можете иметь updated_at обновлять, когда отношения меняются. Пока ваша дочерняя модель имеет отношение к родительской модели, вы можете добавить имя отношения в relations собственность и ORM сделают все остальное за вас, когда вы сохраните модель.

Пожалуйста, смотрите первый абзац под образцом кода в документации.

Другие вопросы по тегам