我正在尝试使用新的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,
]);
我在哪里放这个代码?在我的控制器类或模型文件夹中。
如果我需要将此代码放在我的控制器类中,将来我想重用此查询。我是否必须在另一个控制器中重写查询?
如果在模型文件夹中,我将它放在哪个文件夹中?行为,实体或表?我将如何使用它?
由于
答案 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和条件得到两个表的结果并设置限制和顺序 * /