最佳实践1:Codeigniter中的多个连接胖模型,瘦控制器


Best practice for 1:many joins in Codeigniter fat model, skinny controller?

假设我需要显示users和每个user的列表,其中可以有多个user_roles

列表需要显示:Id,用户名,角色,例如

1 | john | member, moderator, admin

我有三个表,分别是:

  1. user包含用户信息
  2. user_role包含角色,即user_role。id和user_role.name
  3. 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');
}

忽略上面代码的不完整性,我只是想传达这个概念。

我是否在模型或控制器级别上执行连接?

我关心的是:

  1. 试图实现胖模型,瘦控制器。
  2. 如果我在模型级别上进行连接,模型函数,因为它太具体,不太可能在其他地方被重用。
  3. 如果我在控制器级别上进行连接,则模型保持通用(这很好)

作为最佳实践,您应该始终将所有与存储相关的逻辑置于模型级别之下。控制器应该只知道如何调用模型的方法并从HTTP请求中传递参数。

如果您有join并且希望重用生成的片段,您可以创建一个共享方法并按需调用它。例如:

class UserModel
{
    // ....
    public function appendJoin($db)
    {
        $db->findUsers()->join(....) 
    }
    // ....
}

然后你可以在控制器中重用它

您应该在Model中创建通常与数据库相关的函数,以便您可以重用它。但是,是的,你可以使用数据库相关的函数($db->findUsers()->join(....))在你的控制器实现你的目标,它不影响与数据库查询执行速度等…