【问题标题】:Best practice for 1:many joins in Codeigniter fat model, skinny controller?1 的最佳实践:Codeigniter 胖模型中的许多连接,瘦控制器?
【发布时间】:2015-10-14 13:31:05
【问题描述】:

假设我需要显示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. 如果我在控制器级别进行连接,模型将保持通用(这很好)

【问题讨论】:

  • 在模型中再添加一种方法的实际问题是什么?您可以将APPPATH . 'MY_Model.php' 中的泛型类与所有通常需要的方法一起使用,而不是从中扩展特定模型。以this one 为例。
  • @Tpojka:你误会了。模型中的另一种方法没有问题,而且我已经从核心模型进行了扩展。这里的问题是在模型中编写一个特定于控制器用例的方法,它不会在其他地方重用。
  • 不确定,可能我理解错了。但我仍然认为它是一个可以专用于一种方法的查询。没有错:像SELECT user.username, group_concat(user_role.name separator ', ') FROM user_user_role JOIN user_role ON user_role.user_role_id=user_user_role.user_role_id JOIN user ON user.user_id=user_user_role.user_id WHERE user_id= ? 这正是我提到另一种方法的确切意义。这就是我将如何使用它。也许对你没有帮助,而不是我误解了这个问题。

标签: php mysql codeigniter join


【解决方案1】:

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

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

class UserModel
{
    // ....

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

    // ....
}

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

【讨论】:

  • 我明白你的意思。从这里看,控制器是我调用最终 result()/result_array() 活动记录方法的地方,是这样完成的吗?
  • @komirad 是的。共享方法的工作是在现有对象上附加数据。这就是使其可重用的原因,同时您将存储逻辑保留在模型中。
【解决方案2】:

您应该在Model中正常制作与数据库相关的功能,以便您可以重用它。 但是,是的,您可以在控制器中使用与数据库相关的功能($db->findUsers()->join(....) )来实现您的目标,并且它不受数据库查询执行速度等的影响......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2011-01-23
    • 2011-07-06
    • 2014-03-09
    相关资源
    最近更新 更多