CakePHP扩展模型

时间:2014-07-09 14:00:02

标签: php cakephp cakephp-2.0

我正在使用cakePHP开发小型网页并试图掌握MVC概念。

我有控制器,我正在检索具有指定ID的帖子。

$post = $this->Post->findById($id);

我需要检索帖子标题,与它的id连接 - 但我不想直接在控制器中执行此操作。 当然我可以写在$ post ['id']。','。$ post ['title']下面,因为$ post是一个数组。 但在许多地方都需要这样做。我能以某种方式扩展模型以实现方法吗?

我的方法是:

class Post extends AppModel {
    public function getTitleWithId() {
        return $this->id.','.$this->title;
    }
}

但是我看到模型对象并不是最后一次获取的对象。

也许我只需要创建PostEntity对象,在构造函数中接受findById返回的数组?但也许有更好的解决方案。

2 个答案:

答案 0 :(得分:2)

您的方法是正确的:让所有数据管理都在模型中。

尽管如此,请查看虚拟字段。它会更容易连接:

http://book.cakephp.org/2.0/en/models/virtual-fields.html

然后你可以找到你的虚拟领域:

$this->Post->find('first', array(
    'conditions' => array(
        'id' => $id
    ),
    'fields' => array('yourVirtualField')
));

修改

既然我已经再次阅读了你的问题,可能你需要做一个行为

http://book.cakephp.org/2.0/en/models/behaviors.html

将其视为一种拥有多重继承的方式(不一样,但有点想法)。您可以在其上开发方法,并将此行为仅附加到您需要的模型:

public $actsAs = array('yourBehavior');

答案 1 :(得分:1)

在CakePHP中,Model类是管理器,而不是Model的实例(即使id存储在其中)。您只需将id传递给您的方法并返回您想要的内容:

class Post extends AppModel {
    public $name = 'Post' ;
    public function getTitleWithId($id) {
        $post = $this->read(null, $id) ;
        return $post[$this->name]['id'].','.$post[$this->name]['title'];
    }
}