Допустим, у меня есть 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();
Вместо того, чтобы дурачиться с наблюдателями, видя, что вы хотите 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',
),
),
);
Если вы используете relations
Свойство конфигурации наблюдателя вы можете иметь updated_at
обновлять, когда отношения меняются. Пока ваша дочерняя модель имеет отношение к родительской модели, вы можете добавить имя отношения в relations
собственность и ORM сделают все остальное за вас, когда вы сохраните модель.
Пожалуйста, смотрите первый абзац под образцом кода в документация.
Наконец-то я нашел способ сделать это благодаря Ура-х Комментарии.
Этот код работает сейчас, как я хотел; это было проще, чем я думал.
Модели:
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();