1

我正在尽我所能学习 MVC 和 cakePHP,我有一个关于将数组传递给视图的问题。目前,我在下面有一些基本代码。

类 AwarenesscampaignsController 扩展 AppController {

public function view($id = null) {
    $this->Awarenesscampaign->id = $id;
    $this->set('data', $this->Awarenesscampaign->read());
}

这就是我“认为”目前正在发生的事情。

AwarenesscampaignsController 已设置。视图参数请求 id 并将其与模型 Awarenesscampaign 匹配。这与数据库匹配并返回一个设置为变量“$data”的数组,然后加载视图。

我的第一个问题:我的理解准确吗?

我想做的是能够从不同的模型传递另一个数组。例如,我想查询表 Posts (Controller: PostsController/ Model: Post)。

例如,我的第一次尝试是在函数内部执行以下操作:

$this->Post->find('all');

但这会产生错误:

间接修改重载属性 AwarenesscampaignsController::$Post 无效 [APP/Controller/AwarenesscampaignsController.php, line 20]

此外,我不确定如何将这两个变量发送到视图。

回顾一下:

  1. 我的理解准确吗?
  2. 如何从另一个控制器/模型查询变量?
  3. 如何将此数组发送到该控制器的适当视图?

谢谢,-M

4

2 回答 2

2

你在正确的路线上,并且本身并没有做错。我想说你的理解对于初学者来说非常好。

默认情况下,Cake 会自动加载它认为与控制器直接相关的模型。所以在 中AwarenesscampaignController,你可以自动访问Awarenesscampaign(模型)。

不过,它不知道任何其他型号。您可以解决此问题的一种方法是将以下属性添加到您的控制器:

// This has to contain ALL models you intend to use in the controller
public $uses = array('Awarenesscampaign', 'Post');

在开始声明函数之前,这位于类的顶部。它告诉 Cake 你想使用除“默认”模型之外的其他模型,但你也必须将那个模型添加到数组中,否则你将无法访问它。

loadModel如果是一次性的,您也可以在您的操作中使用。然后以与正常访问模型相同的方式访问它:

public function view($id = null) {
    $this->loadModel('Post');
    $posts = $this->Post->find('all');
    ...
}

要将其发送到您的视图,您可以set再次调用,但您可能希望更改data为更具可读性的内容,并防止混淆:

public function view($id = null) {
    ...
    $this->set('campaign', $this->Awarenesscampaign->read());
    $this->set('posts', $this->Post->find('all'));
}

它们将分别可以$campaign访问$post

不过,我要做的一个调整是不要使用“读取”,除非您打算编辑某些内容。您可以使用findByColumnName来获取相同的数据。由于您只使用一个id,您可以调用findById

$campaign = $this->Awarenesscampaign->findById($id);

那里有很多魔法。这只是意味着您可以以更简写的格式搜索特定值。

http://book.cakephp.org/2.0/en/models/retrieving-your-data.html

最后,虽然您可以访问其他模型(如图所示),但您不能或通常不应该尝试从另一个控制器访问一个控制器。如果您有想要在多个控制器中使用的代码,但无法进入模型,您可以创建Components.

http://book.cakephp.org/2.0/en/controllers/components.html#creating-a-component

该手册相当全面。虽然有时难以导航,但它通常可以回答您的大多数问题。

http://book.cakephp.org/2.0/en/

于 2012-04-07T21:08:29.000 回答
2

1)你的理解足够好。这基本上是用对象映射一行数据库表。因此,在设置了 Model id 之后$this->Awarenesscampaign->id = $id,现在 Model 指向的数据库表的 id 等于传递给查看操作的内容。

2)您可以通过调用该特定模型的方法来查询另一个表。如果您的模型以某种方式与您所在的当前模型相关联,则可以使用链接来调用该模型的操作。例如,如果您的 in Posts 控制器和 Post Model 与 Comment Model 相关联,则可以获取您可以链接的数据。

    $comments = $this->Post->Comment->find();

但是,如果您感兴趣的模型与当前模型没有关联,则有几种方法可以执行其他模型的操作。一个不错的选择是使用类注册表。例如,假设您想使用与当前模型无关的客户模型。在你的控制器中,你会做

   $customer= ClassRegistry::init("Customer");
   $customers= $customer->find();

3)为视图设置多个变量,您可以通过compact函数或使用关联行设置它们。

   $posts = $this->Post->find();
   $comments = $this->Post->Comment->find();

   $this->set(compact('posts', 'comments'));
   // or
   $this->set('posts' => $posts, 'comments' => $comments);
于 2012-04-07T21:13:56.063 回答