CakePHP 3.0放置查询的位置

时间:2015-07-02 13:02:45

标签: php mysql cakephp cakephp-3.0

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

Lets说我们有这样的东西,直接来自他们的文档。

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

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

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

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

由于

3 个答案:

答案 0 :(得分:2)

如果您只使用一次,则可以将其置于控制器操作中。但我们喜欢我们的模型胖,所以你应该把它放在你的模型中的方法(表)中以便重新使用(保留你的代码DRY

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

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

答案 1 :(得分: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();

答案 2 :(得分:0)

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