Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 最佳实践1:多人加入Codeigniter脂肪模型,瘦控制器?_Php_Mysql_Codeigniter_Join - Fatal编程技术网

Php 最佳实践1:多人加入Codeigniter脂肪模型,瘦控制器?

Php 最佳实践1:多人加入Codeigniter脂肪模型,瘦控制器?,php,mysql,codeigniter,join,Php,Mysql,Codeigniter,Join,假设我需要显示一个用户列表和每个用户,其中可以有许多用户角色 列表需要显示: id、用户名、文本中的角色,例如 1 | john | member, moderator, admin 我有三张桌子,分别是: user包含用户信息 user\u role包含角色,即user\u role.id和user\u role.name user\u user\u role加入表,即user\u id、role\u id 用户列表控制器: function list_users(){ // Sho

假设我需要显示一个
用户列表
和每个
用户
,其中可以有许多
用户角色

列表需要显示: id、用户名、文本中的角色,例如

1 | john | member, moderator, admin
我有三张桌子,分别是:

  • user
    包含用户信息
  • user\u role
    包含角色,即user\u role.id和user\u role.name
  • user\u user\u role
    加入表,即user\u id、role\u 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请求传递参数

    如果您有连接并希望重用生成的片段,那么可以创建一个共享方法并根据需要调用它。例如:

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

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

    您应该在模型中创建与数据库相关的函数,这样您就可以重用它了。
    但是是的,您可以在控制器中使用数据库相关函数($db->findUsers()->>join(..))来实现您的目标,并且它不受数据库查询执行速度等的影响。

    在模型中多使用一个方法的实际问题是什么?您可以使用类似于
    APPPATH'中的泛型类MY_Model.php'
    和所有通常需要的方法,然后从中扩展特定的模型。例如,检查一下。@Tpojka:你误解了。模型中再增加一个方法没有问题,我已经从一个核心模型进行了扩展。这里的问题是在模型中编写一个方法,该方法非常特定于控制器用例,因此不会在其他地方重用。不确定,可能我误解了。但我仍然将其视为一个可以专用于一种方法的查询。在这方面没有什么错误:类似于
    从user\u user\u role中选择user.username,group\u concat(user\u role.name分隔符“,”)在user\u role上加入user\u role。user\u role\u id=user\u user\u role.user\u id在user上加入user。user\u id=user\u user\u role.user\u id其中user\u id=?
    这正是我提到的另一种方法的重点。这就是我将如何使用它。也许这对你没有帮助,因为我误解了这个问题。我明白你的意思。从这里看,控制器就是我调用final result()/result\u array()活动记录方法的地方,是这样做的吗?@komirad是的。共享方法的任务是将数据附加到现有对象上。这就是它的可重用性,同时将存储逻辑保留在模型中。