假设我需要显示users
和每个user
的列表,其中可以有多个user_roles
。
列表需要显示:Id,用户名,角色,例如
1 | john | member, moderator, admin
我有三个表,分别是:
-
user
包含用户信息 -
user_role
包含角色,即user_role。id和user_role.name -
user_user_role
连接表user_id, role_id
用户列表控制器:
function list_users(){
// Should I join here?
$this->user_model->find_users();
}
用户模式:function find_users(){
// Should I join here?
return $this->db->get('user');
}
忽略上面代码的不完整性,我只是想传达这个概念。
我是否在模型或控制器级别上执行连接?
我关心的是:
- 试图实现胖模型,瘦控制器。
- 如果我在模型级别上进行连接,模型函数,因为它太具体,不太可能在其他地方被重用。
- 如果我在控制器级别上进行连接,则模型保持通用(这很好)
作为最佳实践,您应该始终将所有与存储相关的逻辑置于模型级别之下。控制器应该只知道如何调用模型的方法并从HTTP请求中传递参数。
如果您有join并且希望重用生成的片段,您可以创建一个共享方法并按需调用它。例如:
class UserModel
{
// ....
public function appendJoin($db)
{
$db->findUsers()->join(....)
}
// ....
}
然后你可以在控制器中重用它
您应该在Model中创建通常与数据库相关的函数,以便您可以重用它。但是,是的,你可以使用数据库相关的函数($db->findUsers()->join(....))在你的控制器实现你的目标,它不影响与数据库查询执行速度等…