我有两个表的数据库。一个是博客文章,一个是用户,由帖子表中的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非常陌生,因此我认为我对如何使用循环的理解可能不正确。也许有更好的方法不需要循环?
默认情况下,CakePHP中的控制器只加载它们自己的模型。如果您在某个时候需要其他模型,则需要手动加载它。
但这并不能解决您的问题,因为您正在将find()
操作的结果直接设置到视图中。您需要等待,直到您将用户添加到它。哦,你通常不能用foreach
遍历$this
,除非你的类实现了一个类似迭代器的接口(控制器不应该有理由这样做)
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);
}
一旦你理清了这一点,请仔细阅读链接模型。有一种方法可以设置您的Post
模型,这样它就可以自动用相应的用户填充
$Post['Post']['author']
,而无需手动操作。
最好在模型中指定关系。
在Post模型中,初始化Post和用户之间的关系
public $hasOne = 'User';
现在在控制器中,使用Contain()获取链接模型数据
$posts = $this->Post->find('all')->contain(['User']);
$this->set('posts', $posts);
您将使用每个post记录获取用户对象,您可以使用这些记录获取用户名,您不需要编写单独的查询来获取用户名。