【问题标题】:cakephp: blog tutorial tutorial extendedcakephp:博客教程教程扩展
【发布时间】:2014-04-25 16:10:18
【问题描述】:

我正在尝试扩展文档中的简单博客教程。

我在 /app/View/Users/index.ctp 上有一个 index.ctp,所有用户都在每个用户名上显示一个链接......当我点击用户名时,我希望它会进入视图.ctp 并显示每个用户的博客帖子以及每个用户完成的帖子数量。

我在这里得到一个错误。我需要为此编写一个组件吗?如果是这样,我该怎么做?

class UsersController extends AppController {
  public function view($id = null) {
   $this->set('allposts',$this->Post->findByUserId($id));
  }
}

所以此时我收到一个错误,因为它在用户模型中看不到 Post 模型。我该如何解决这个问题?

谢谢....

【问题讨论】:

  • 顺便说一句,对于未来的问题,包括您得到的确切错误、堆栈跟踪、通知、警告等。

标签: cakephp blogs


【解决方案1】:

不,您不需要为此使用组件。如果您已正确链接模型(就是这样,设置 belongsTos 和 hasMany(es) 等),那么您必须通过连接访问帖子。

$this->set('allposts',$this->User->Post->findByUserId($id));

请参阅other questions 了解此问题。

现在,稍微扩展一下,因为您似乎对组件的实际作用有些困惑。组件是向控制器扩展或添加功能的一种方式。如果你想,比如说,创建一个新的 Paginator,或者从你的控制器调用 Facebook 来获取信息,并且没有明确的放置位置(用户可以拥有 Facebook 信息,但如果你有另一个名为“Friends”的控制器,你可能也必须在那里放一些 facebook 功能)。

通常,如果您认为您需要一个组件来调用从一个模型到另一个模型,这表明您组织错误(不是一般规则,我愿意接受不正确的示例)。

【讨论】:

  • 如果模型没有链接,您也可以加载Post模型并查询它。使用loadModelApp::uses$this->uses=array('Post', 'User')
  • 非常正确,尽管出于性能原因我不鼓励App::usesloadModelClassRegistry::init() 是选项。没有将它们添加到答案中,因为我认为 OP 只需要在正确的方向上稍微推动一下,而不是整个蛋糕。另请参阅this answer 了解更多信息。感谢您指出,@cornelb :)
  • App::uses 用于延迟加载book.cakephp.org/2.0/en/core-utility-libraries/… 你只需要使用$Post = new Post(); 创建对象就可以了,应该不会有任何性能问题
  • 您可以加载 20 个模型,并且您可以“延迟加载”它们以执行仅将两个数字相加的操作。诚然,我自己没有做过基准测试,所以我可能只是在散布不好的谣言,但从我所读到的内容(现在显然找不到那么多参考资料),这是最不推荐的选项。啊,one ref
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多