如何使用mysql访问CakePHP中的相关记录?

时间:2017-06-15 12:26:49

标签: php cakephp

我有两个表的数据库。一个包含博客帖子,另一个包含用户,与post表中的user_id字段相关。在我的索引页面上,我有一个帖子的表格,我想添加作者,但是我想显示用户的名字而不是他们的ID。我试图在PostsController中添加一个作者字段给我的帖子对象:

public function index() {
    $this->set('posts', $this->Post->find('all'));
    foreach ($this as $post){
        $post['Post']['author'] = $this->User->findById($post['Post']['user_id']);
    }
}

但是这会带来我在null上调用findById的错误。我是非常新的php所以我认为我对如何使用循环的理解可能是不正确的。也许有一种更好的方法不需要循环?

2 个答案:

答案 0 :(得分:0)

默认情况下,CakePHP中的控制器只加载自己的模型。如果您在某个时候需要其他模型,则需要load it in manually

但这并不能解决您的问题,因为您正在将find()操作的结果直接设置到视图中。您需要等待,直到您将用户添加到它。哦,你通常不能用$this遍历foreach,除非你的类实现了一个类似Iterator的接口(控制器永远不应该有理由这样做)

public function index() {
    // first load in the User model
    $this->loadModel('User');

    // store the posts in a local variable first
    $posts = $this->Post->find('all');

    // loop through the local variable, also keep the index so we can reference
    // the post we're modifying
    foreach ($posts as $index => $post) {
        $post['Post']['author'] = $this->User->findById($post['Post']['user_id']);

        // write the modified $post back into the $posts array
        $posts[$index] = $post;
    }

    // **now** you can make $posts available to your view
    $this->set('posts', $posts);
}

完成整理后,read up on linking models together。有一种方法可以设置您的Post模型,以便自动使用相应的$post['Post']['author']填充User,而无需您手动执行此操作。

答案 1 :(得分:0)

最好在模型中指定关系。

在Post Model中初始化post和user

之间的关系
public $hasOne = 'User';

现在在控制器中使用Contain()来获取链接的模型数据

$posts = $this->Post->find('all')->contain(['User']);

$this->set('posts', $posts);

您将获得用于获取用户名的每个帖子记录的User对象,您无需编写单独的查询来获取用户名。