2010-01-21 91 views
2

我刚刚得到了关于模型的这种怀疑...Codeigniter:模型问题!

这是我第一个100%MVC项目(种)...我的疑问是...当生病做一个联合,联合或任何功能多于一张桌子...我怎么做这个?使用“主表”相同的模型文件或我需要创建一个新的模型文件使用两个或任何表?

Tkz ... Roberto!

回答

4

无论你喜欢,你都可以做到。一个模型没有被限制为一张表,你可以JOIN,UNION和UPDATE无论你喜欢哪张表。

为了进一步Donny Kurnia的建议,一个非常好的现有MY_Model已经由Jamie Rumbleow编写(有几个贡献来自我自己),它包含几个get,count,insert等方法。这些允许您通过创建一个从MY_Model扩展的空模型来简单地完成大多数基本的CRUD需求。

这对于单表格get/insert/delete来说很好,但是当涉及到创建需要连接的方法时,最好的办法就是自己写。

当连接表时,您需要根据表名/别名设置WHERE,如果您不小心,您会发现有冲突的字段名,这意味着创建一个通用解决方案来管理来自MY_Model的所有连接查询要么是非常困难或只是一团糟。

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

class Tickets_m extends MY_Model 
{ 
    // Basic get, insert, delete stuff handled in MY_Model 

    function get_client_tickets($category_slug = '') 
    { 
     $this->db->select('t.*') 
      ->select('c.title as category_title, c.slug as category_slug') 
      ->select('p.name as priority_name') 
      ->join('categories c', 'c.id = t.category_id') 
      ->join('priorities p', 'p.id = t.priority_id') 
      ->from('tickets t') 
      ->where('c.client_id', CLIENT_ID); 

     if($category_slug) 
     { 
      $this->db->where('c.slug', $category_slug); 
     } 

     return $this->db->get()->result(); 
    } 

    function get_client_ticket($id) 
    { 
     $this->db->select('t.*') 
      ->select('c.title as category_title, c.slug as category_slug') 
      ->select('p.name as priority_name') 
      ->join('categories c', 'c.id = t.category_id') 
      ->join('priorities p', 'p.id = t.priority_id') 
      ->from('tickets t') 
      ->where('c.client_id', CLIENT_ID) 
      ->where('t.id', $id); 

     return $this->db->get()->row(); 
    } 

    function insert($ticket) 
    { 
     $this->load->helper('date'); 

     $ticket['created_on'] = now(); 

     return parent::insert($ticket); 
    } 

} 

这是一个非常简单的模型,我与这说明我结合了GET,get_by,插入使用MY_Model的时刻工作的一个例子,与具有加入一些自定义的方法和额外的数据更新他们。

您还可以看到我重载insert()以自动添加创建的日期,而无需在每个可能创建或更新故障单的控制器中设置它。

如果您需要更神奇的自动MATIC木工疯狂,尝试ORM的东西,如DoctrineDataMapper

+0

UAU ......这个MY_Model非常新的,非常有用的信息...非常感谢你 – Roberto 2010-01-22 03:54:39

3

我想分享我的方法。

首先,我做了我自己的MY_Model类有get_detailget_totalget_listget_allinsertupdatedelete方法。我把这个类放在文件夹system/application/libraries文件夹中。这个类extends CI的Model类。本课程中所有相关的查询使用$this->tablename。然后实际的模型类将只需要这个代码,使其工作:

class Product_model extends MY_Model { 

    function Product_model() 
    { 
    parent::MY_Model(); 
    $this->tablename = 'product'; 
    } 

} 

当我需要参加2台以上,我把在主表的型号代码。例如:我有product,categoryuser表。如果我需要获得产品,使用插入数据的类别名称和用户名称,那么'主'表将作为产品。我将里面Product_model这个方法:

function get_list_joined($start=0, $item_num=10, $condition='', $order_by='') 
{ 
    //do query for product, left join to category and user table 
    //return result 
} 

使用这种方法,我仍然有get_list功能,只有从product返回表列,也有get_list_joined功能,从product表,category表,user返回列表。

首先确定主类是很重要的,以避免使用多种方法来执行相同的操作。

要进行连接,包含在CI中的数据库类就足够了。但我更喜欢使用AdoDB作为数据库库。它提供比CI更多的数据库支持。但是一开始,你只使用mysql,那么CI的数据库就足够了。一次学习一个。