我必须创建一个显示多个表中不相关数据的视图。我是CakePHP(和PHP一般)的新手,据我所知,每个模型只描绘一个表。我知道我们可以定义与其他表的关联,但在我的情况下,我需要访问与模型谁将打开的数据无关的数据。
实施例: 假设有一个博客平台,我们正在查看帖子。 (模型 - 发布,功能 - 阅读)。现在我想要一份我们的时事通讯的(Say)订阅者列表。这些数据与模型无关,因此我认为控制器无法访问数据。请告诉我如何直接查看这些数据。
答案 0 :(得分:3)
在控制器中,在定义类时,添加一个类属性$ uses来告诉控制器要加载哪些模型。
class SomeController extends AppController {
public $name = 'Some';
public $uses = array( 'Model1', 'Model2' );}
然后,在您的方法中,您只需调用该模型:
$result = $this->Model1->find('all');
$result2= $this->Model2->find('all');
答案 1 :(得分:2)
有几种方法可以做到这一点。这是gwoo关于它们如何区别以及何时使用的概要:
App :: import()仅包含该文件。 所以你会新来创建一个新的 每次都是实例。这不是 推荐的
ClassRegistry :: init()加载文件, 将实例添加到对象图 并返回实例。这是个 方便快捷的访问方式 模型。
控制器:: loadModel();用途 ClassRegistry :: init()添加模型 到控制器的属性和 也允许persistModel 启用。
虽然你“可以”做任何这些 事情,你应该问问自己为什么 你正在创建依赖 不自然的模型 控制器。如果你“有”使用 任何这些,然后我会这样做 我描述的方式的逆序 他们。 IE,Controller :: loadModel() 那么CR :: init()实际上我从来没有 对模型使用App :: import()。希望 这有帮助。
有关完整讨论,请参阅此页:http://groups.google.com/group/cake-php/browse_thread/thread/137c57b4eb010317
此外,其他一些答案建议在$uses
数组中包含不相关的模型,但我会避免使用此方法,因为它实际上是要告诉模型使用哪个数据库表并暗示其成员是这是模型目的的核心,在你描述的情况下并非如此。
答案 2 :(得分:0)
如果您要在同一型号的几个功能中使用它,您应该通过以下方式在Controller中指定它:
$uses = array('Post', 'Suscriber');
现在,如果它是布局的元素,则应将其设置在元素上。
在视图中:
$这 - > renderElement( 'suscribers列表');
现在,您必须在views / elements中创建suscribers-list.ctp文件。从那里导入模型:
App::Import('Model', 'Suscriber');
$this->Suscriber = new Suscriber();
$suscribers = $this->Suscriber->find('all');
pr($suscribers);
它不漂亮,但它对我有用。我不知道是否还有另一种方式。
答案 3 :(得分:0)
您可以使用更少的代码执行此操作,并且稍微简单一些。您可以使用AppController::loadModel('ModelName')
。 (reference)这种方法负责metrobalderas建议的启动步骤,如果成为
$this->loadModel('Subscriber');
$subscribers = $this->Subscriber->find('all', ... );
有一个在1.2中被弃用的函数只是loadModel('ModelName');
而不是AppController方法。还应该注意的是,您不应该直接在元素中加载模型,因为这实际上不符合MVC的精神。在模型中保留它。使用此方法而不是var $uses = array('ModelName');
确实减少了不需要它的方法中不相关模型的开销,并减少了使用该方法时可能发生的一些复杂情况。