2013-04-04 83 views
0

我用笨并有三个表并为每个模型:在CodeIgniter中查询多对多表时,如何保持模型松散耦合?

  • 用户 - 用户的表
  • 产品 - 产品表
  • UserProduct - 表,显示哪些用户有哪些产品(二外键列和其他一些列如日期)

在我的代码中,我想显示一个特定用户列表,显示他们拥有哪些产品。所以我在UserProduct类中有一个方法,它在UserProduct表上进行与userId相匹配的选择,以及一个引入所有我需要的关于每个产品的数据的联接。

这工作得很好,但我现在担心我正在向紧密耦合的方向发展。例如,假设我想查找产品图片的网址。我在产品模型中有一个方法来返回它,我不想在UserProduct模型中使用重复方法,而且我也不想通过让UserProduct模型尝试访问其他模型中的方法来创建耦合(我不要以为CodeIgniter喜欢你这样做)。

在访问具有外键的数据库表的任何模型中,似乎可能会出现此问题,其中该模型可能需要来自父表的数据并且想操纵它。

是否有一个优雅的解决方案,还是我需要接受外键必然会在模型中创建耦合或需要跨模型的类似方法?

TIA, Phil。

回答

0

我的个人标准是始终创建1个控制器+ 1个模型。

例如site.com/users将使用model_users.phpsite.com/products将使用model_products.php

苗条你的代码和再利用的方法例如使用方法PARAMS模型方法被重新使用的可能是:

function getUsers($data){ 
foreach($data as $key=>$value){ 
    $this->db->where($key,$value); 
} 
$query = $this->db->get('users'); 
return $query->result(); 
} 

您越是将这种方法扩展得越多,您可以重复使用越多,只是另一个延伸范例:

function getUsers($data,$order_by = false){ 
    foreach($data as $key=>$value){ 
     $this->db->where($key,$value); 
    } 
if($order_by){ 
    foreach($order_by as $key=>$value){ 
    $this->db->order_by($key,$value); 
    } 
    } 
    $query = $this->db->get('users'); 
    return $query->result(); 
    } 

//then you call results with this in your controller 
    $results = $this->model->getUsers(
     $data = array('id'=>'12','country'=>'USA'), 
     $order_by = array('username'=>'DESC') 
    ); 

所以现在你也得到了order_by,等等,你可以在相同或相当的同样的方法添加joins, limit,offset,like等。总之,更多的accurated你更可以重复使用同样的方法

+0

感谢okok。我不确定我是否喜欢这个解决方案,因为它会引发一个不断增长的基础模型,其中包含各种不同功能的业务逻辑方法。当然,表具体方法应该在他们各自的模型中,而不是出现在所有其他模型扩展的基础模型中? – 2013-04-04 12:10:11

+0

@PhilipWattis肯定表 - >模型;)如果你需要连接好使用1模型不嵌套方法 – sbaaaang 2013-04-04 12:36:53