【问题标题】:Passing two arrays from controller in cakePHP在 cakePHP 中从控制器传递两个数组
【发布时间】:2012-04-07 20:47:24
【问题描述】:

我正在尽最大努力学习 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

【问题讨论】:

    标签: php cakephp variable-assignment


    【解决方案1】:

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

    默认情况下,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/

    【讨论】:

    • 感谢您抽出宝贵时间彻底回答问题并让我跟进阅读。我真诚地感谢它。
    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      相关资源
      最近更新 更多