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.nameuser\u user\u role
加入表,即user\u id、role\u idfunction 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是的。共享方法的任务是将数据附加到现有对象上。这就是它的可重用性,同时将存储逻辑保留在模型中。