0

这是我想要做的事情

我有一个表,其中包含许多不同类型的项目数据。模型名称是“对象”

例如 :

row 1 : item_type = event
row 2 : item_type = news
row 3 : item_type = booking

我想编写一个控制器'event_controller'并使用'Object'模型并且只处理item_types的事件。和另一个新闻控制器(news_controller)并使用相同的模型。

我如何在 cakephp 上做到这一点。

我从codeigniter进入蛋糕,在CI中我们可以将我们想要的任何模型加载到任何控制器中我可以用蛋糕做类似的事情吗?

4

3 回答 3

2

var $uses在 CakePHP 1.3+中使用它被认为是糟糕的形式。它已被 App::import 取代(见下文

假设您有一个带有 User 模型的 Users 控制器,以及一个带有 Comment 模型的 Comments 控制器。接受的模式是:

使用关联

如果模型可以在逻辑上关联,这是您最好的选择。

// models/user.php
Class User extends AppModel {
    public $hasMany = array('Comment');
}

// controllers/users_controller.php
Class UsersController extends AppController {
    function allComments() {
        $this->User->Comment->find('all'); // You can use this across multiple models (e.g. $this->User->Comment->NestedComment->find('all');
    }
}

实例化模型对象

这将加载您的模型文件,将实例添加到 CakePHP 的对象映射,并返回该实例。

// models/user.php
Class User extends AppModel {}

// models/comment.php
Class Comment extends AppModel {}

// controllers/users_controller.php
Class UsersController extends AppController {
    function allComments() {
        $Comments =& ClassRegistry::init('Comment');

        $Comments->find('all');
    }
}

使用 $this->loadModel

这在内部使用 ClassRegistry::init,然后还将模型添加为控制器的属性。

// models/user.php
Class User extends AppModel {}

// models/comment.php
Class Comment extends AppModel {}

// controllers/users_controller.php
Class UsersController extends AppController {
    function allComments() {
        $this->loadModel('Comment');

        $this->Comment->find('all'); // using load model allows you to access it via $this->Model
    }
}

应用::导入

这实际上只是需要文件的 CakePHP 方式。您仍然需要实例化该对象。

// models/user.php
Class User extends AppModel {}

// models/comment.php
Class Comment extends AppModel {}

// controllers/users_controller.php
App::import('Model', 'Comment');
Class UsersController extends AppController {
    function allComments() {
        $Comment = new Comment();

        $Comment->find('all');
    }
}

我希望这有帮助。

编辑:如果你想在控制器中全局使用模型对象,你可以使用我在你的beforeFilter().

于 2011-09-02T04:49:38.107 回答
1

我建议你不要$uses 表态。取而代之的是,您可以使用模型$this->Model->M0del1->....->someFunc();的关系,例如关系是否存在。

如果模型之间的关系不存在,那么只需$this->loadModel('ModelName');在您需要的任何地方使用特定功能。

如果您使用 var $uses = array('Object');,它将成为控制器的全局变量,并且无论您是否需要它,它都会为控制器的所有操作加载该模型。这会影响你的表现。

如果您$this-LoadModel('ModelName');在特定功能中使用,它将仅在该功能中加载,而不是在所有操作中。

于 2011-09-02T02:01:04.943 回答
0

您声明您的控制器并在其上声明 $uses 变量,如下所示:

var $uses = array('Object');
于 2011-09-02T00:21:08.893 回答