在CodeIgniter中查询多对多表时,如何保持模型松散耦合?

时间:2013-04-04 09:57:45

标签: codeigniter join model many-to-many loose-coupling

我正在使用CodeIgniter并且每个都有三个表和一个模型:

  • 用户 - 用户表
  • 产品 - 产品表
  • UserProduct - 显示哪些用户拥有哪些产品(两个外键列以及其他一些列如日期)的表格

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

这很好用,但我现在担心的是我正在走紧耦合的道路。例如,假设我想找出产品图片的网址。我在产品模型中有一个方法来返回它,我不想在UserProduct模型中使用重复方法,并且我不想通过让UserProduct模型尝试访问其他模型中的方法来创建耦合(我不要以为CodeIgniter会让你这么做。)

在访问具有外键的数据库表的任何模型中,似乎可能会出现此问题,其中该模型可能需要父表中的数据并希望对其进行操作。

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

TIA, 菲尔。

1 个答案:

答案 0 :(得分:0)

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

例如site.com/users将使用model_users.php 要么 site.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等等。所有这些都以相同或相同的方式,你越精确,你就能越多使用相同的方法