- 所有查询都应在模型中执行。
- 视图中的处理逻辑应保持在最低限度。如果您需要使用一些基本的循环或条件,可以,但几乎所有的数据准备都应该在 View 之前完成。
- 通过单引号
$owner 变量,您可以将其转换为文字字符串 - 换句话说,它呈现为一个美元符号后跟五个字母,这肯定不是您想要的。
- codeigniter 的
where 方法的默认比较是=,所以你不需要声明等号。
- 我不知道您使用的是哪个 Auth 库,所以我会冒险假设
get_user() 返回一个对象——您希望访问该对象的当前用户的 ID。这将需要将 ->id 链接到方法调用的末尾以访问 id 属性。
现在,让我们重新编写 MVC 架构的脚本。
故事从控制器开始。你没有传入任何数据,所以它的职责是:
- 加载模型(如果尚未加载)
- 调用模型方法并将所有者ID作为参数传递。
- 加载视图并将模型返回的结果集作为参数传递。
*注意没有查询,也没有显示内容。
控制器:(无一次性变量)
public function files() {
$this->load->model('Files_model');
$this->load->view(
'user_files',
['files' => $this->Files_model->Files($this->auth->get_user()->id)]
);
}
或者,如果您更喜欢声明式的好处/可读性,您可以使用一次性变量编写您的控制器。
public function files() {
$this->load->model('Files_model');
$userId = $this->auth->get_user()->id;
$data['files'] = $this->Files_model->Files($userId);
$this->load->view('user_files', $data);
}
模型:(传入参数,返回结果集)
public function Files($userId) {
return $this->db->get_where('files', ['owner' => $userId])->result();
}
在上面的 sn-p 中,生成的查询将是:
SELECT * FROM files WHERE owner = $userId
如果没有符合条件的结果或对象的索引数组,则结果集(假设查询适合 db 表模式)将是一个空数组。无论哪种方式,返回值都是一个数组。
在最后一步中,视图将接收填充的结果集为$files(该变量由在视图加载方法中声明的关联一级键命名)。
查看:
<?php
foreach ($files as $file) {
echo "<span>{$file->name}</span>";
}
{ 和 } 不是必需的,我只是更喜欢它在我的 IDE 中的可读性。
总而言之,数据流是这样的:
控制器 -> 模型 -> 控制器 -> 视图
只有模型进行数据库交互。
只有视图打印到屏幕。