我刚刚得到了关于模型的这种怀疑...Codeigniter:模型问题!
这是我第一个100%MVC项目(种)...我的疑问是...当生病做一个联合,联合或任何功能多于一张桌子...我怎么做这个?使用“主表”相同的模型文件或我需要创建一个新的模型文件使用两个或任何表?
Tkz ... Roberto!
我刚刚得到了关于模型的这种怀疑...Codeigniter:模型问题!
这是我第一个100%MVC项目(种)...我的疑问是...当生病做一个联合,联合或任何功能多于一张桌子...我怎么做这个?使用“主表”相同的模型文件或我需要创建一个新的模型文件使用两个或任何表?
Tkz ... Roberto!
无论你喜欢,你都可以做到。一个模型没有有被限制为一张表,你可以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的东西,如Doctrine或DataMapper
我想分享我的方法。
首先,我做了我自己的MY_Model
类有get_detail
,get_total
,get_list
,get_all
,insert
,update
和delete
方法。我把这个类放在文件夹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
,category
和user
表。如果我需要获得产品,使用插入数据的类别名称和用户名称,那么'主'表将作为产品。我将里面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的数据库就足够了。一次学习一个。
UAU ......这个MY_Model非常新的,非常有用的信息...非常感谢你 – Roberto 2010-01-22 03:54:39