Cakephp - 一页中有两个表

时间:2015-01-29 16:36:20

标签: cakephp

我试图了解Cakephp。我按照官方页面http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/blog.html中的说明进行操作,现在我可以在页面上显示一些帖子。由于某些原因,所有文件和函数都必须具有名称" Posts"但是当你想要搜索数据库表时,你必须写" post" [$ this-> set(' posts',$ this-> post-> find(' all'));]。为什么?我读到了CakePHP约定,但它没有意义。如果我有一个hello.ctp页面和一个" goodmorning"表名?我花了2天时间,我总是这样做:错误:在非对象上调用成员函数find()。我想展示我的帖子和我的#34; goodmorning"表在同一页面上。


为了说清楚,我有两张桌子:

CREATE TABLE `Posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50),
  `body` TEXT,
  `created` DATETIME DEFAULT NULL,
  `modified` DATETIME DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `Comments` (
  `id` int(11) DEFAULT NULL,
  `name` VARCHAR(50),
  `comment` TEXT,
  `created` DATETIME DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

PostController.php

<?php
class PostsController extends AppController {

    public function index() {
        $posts = $this->Post->find('all');
        $this -> set ('posts',$posts);
        $comments = $this->comment->find('all');
        $this -> set ('comments',$comments);
    }
}
?>

PostsModel.php

<?php
class Posts extends AppModel {
}
?>

CommentsModel.php

<?php
class Comments extends AppModel {
}
?>

如果我从PostController中删除这些行:

$comments = $this->comment->find('all');
$this -> set ('comments',$comments);

&#34;帖子&#34;表格将显示(localhost / cake / Posts)。在纯PHP中我可以在几分钟内构建它,但在cakephp中我真的感到绝望

3 个答案:

答案 0 :(得分:0)

$this->set('posts', $this->Post->find('all'));将转到Posts模型,执行find()函数,然后将该数据设置为视图变量$posts。您可以将变量名称更改为&#39;帖子&#39;在$this->set()的第一个参数中,数据将被设置为$Posts的视图变量。

CakePHP的命名约定不适用于变量名称。你应该定义一个你喜欢的风格并坚持下去。帮助文档通常使用所有小写名称,其中的单词用下划线分隔,但除非您引用CakePHP的预定义值之一,否则它与任何内容无关。

您的goodmorning表名称的问题是CakePHP约定的表名应该是小写,复数,并且单词应该用下划线分隔。如果你想要&#34; Cake Magic&#34;要按惯例将所有名称无形地连接在一起,您要创建的是名为good_mornings的数据库表,名为GoodMorning的模型和名为GoodMorningsController的控制器。

答案 1 :(得分:0)

在Cakephp中

使用具有自定义名称的表

<?php
class Post extends AppModel {
  public $useTable = 'goodmorning';
}
?>

使用带自定义名称的视图

public function index() {
  $this->autoRender = false;
  $this->render('hello');
}

答案 2 :(得分:0)

表名必须是小写和复数(例如帖子)

模型名称必须是小写,除了第一个字母和单数(例如Post)

控制器名称必须是复数并附加到单词&#34; Controller&#34; (例如PostsController)

表id必须命名为&#34; id&#34; (但可以使用其他名称命名,您必须在Model类中指定不同的名称。例如$this->Post->id = $newId