【问题标题】:CakePHP 3.0 Where to put queriesCakePHP 3.0 在哪里放置查询
【发布时间】:2015-07-02 13:02:44
【问题描述】:

我正在尝试使用新的 CakePHP 3.0,但在确定查询的位置时遇到了一些麻烦。

让我们说我们有类似的东西,直接来自他们的文档。

$articles = $this->Articles->find('all', [
    'fields' => ['id', 'title'],
    'conditions' => [
        'OR' => ['title' => 'Cake', 'author_id' => 1],
        'published' => true
    ],
    'contain' => ['Authors'],
    'order' => ['title' => 'DESC'],
    'limit' => 10,
]);

我把这段代码放在哪里?在我的控制器类或模型文件夹中。

如果我需要将此代码放在我的控制器类中,并且将来我想重用此查询。我必须在另一个控制器中重写查询吗?

如果在模型文件夹中,我将它放在哪个文件夹中?行为、实体还是表格?我将如何使用它?

谢谢

【问题讨论】:

  • 您必须只在控制器中编写代码,如果您想重用代码,则必须创建组件。网址:book.cakephp.org/2.0/en/controllers/components.html
  • 很遗憾所有数据库sql相关的代码都不能只组织在model文件夹中。谢谢你的回答。
  • @ViswanathPolaki 这是不正确的。查询可以放在控制器中,但通常最好放在更可重用的模型中。
  • 我建议您从阅读 the docscomplete 文档)开始,因为您似乎缺乏一些基础知识。表方法、查找器、行为,这些都可以帮助您重用模型相关的代码。

标签: php mysql cakephp cakephp-3.0


【解决方案1】:

如果你只使用一次,你可以把它放在一个控制器动作中。但我们喜欢我们的模型胖所以你应该把它放在你的模型(表)中的一个方法中以实现可重用性(保留你的代码DRY

之后,您可以在控制器中使用该方法

$this->loadModel('Model'); //if needed
$this->Model->nameOfYourMethod();

【讨论】:

    【解决方案2】:

    如果 $this->Articles 已设置(例如您在 ArticlesController 中),则您提供的示例代码可以在控制器中使用。然而,在 Cake 中,最好将查询代码移到模型级别,这样它更可重用。

    如果您想为模型定义查询方法,请在表中执行此操作。例如:-

    class ArticlesTable extends Table
    {
        public function getAllArticles() {
            return $this->find('all', [
                'fields' => ['id', 'title'],
                'conditions' => [
                    'OR' => ['title' => 'Cake', 'author_id' => 1],
                    'published' => true
                ],
                'contain' => ['Authors'],
                'order' => ['title' => 'DESC'],
                'limit' => 10,
            ]);
        }
    }
    

    您可以随意调用该方法,只要确保该方法的功能清楚即可。

    然后在您的 ArticlesController 中,您可以将其称为:-

    $articles = $this->Articles->getAllArticles();
    

    只要加载了模型,您就可以从任何控制器调用它。例如:-

    $this->loadModel('Articles');
    $articles = $this->Articles->getAllArticles();
    

    【讨论】:

      【解决方案3】:

      /* 您可以在控制器中调用此查询,但请确保您的数据库必须有文章故事和作者表,并且文章表属于作者表。文章表属于作者意味着您的文章表中必须​​有author_id。 实际上这个表是将文章表连接到作者表并根据或,和条件获取两个表的结果并设置限制和顺序 */

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-04
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        • 2021-11-12
        相关资源
        最近更新 更多