假设我有一个拥有Model_Comment的Model_Post。
每次保存新评论时,是否有任何方式可以更新Model_Post的updated_at
字段?我查看了观察员的文档,但我找不到如何以“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();
答案 0 :(得分:1)
您可以获取父级,更新其updated_at,然后通过ORM将这两个对象提交到数据库,而不是与观察者混在一起,看到您想要以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',
),
),
);
答案 1 :(得分:1)
如果您使用观察者配置的relations
属性,则可以在关系更改时进行updated_at
更新。只要您的子模型与父模型有关系,您就可以将关系名称添加到relations
属性中,当您保存模型时,ORM将为您完成剩下的工作。
请参阅documentation中代码示例下的第一段。
答案 2 :(得分:0)
最后,由于Uru's comments,我找到了做到这一点的方法。
此代码现在可以正常使用;它比我想象的要简单。
型号:
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();