我只是对模型产生了怀疑...
这是我的第一个 100% MVC 项目(有点)......我的疑问是......当我对多个表进行连接、联合或任何功能时......我该怎么做?使用“主表”的相同模型文件,或者我需要使用两个或任何表创建一个新的模型文件?
Tkz...罗伯托!
我只是对模型产生了怀疑...
这是我的第一个 100% MVC 项目(有点)......我的疑问是......当我对多个表进行连接、联合或任何功能时......我该怎么做?使用“主表”的相同模型文件,或者我需要使用两个或任何表创建一个新的模型文件?
Tkz...罗伯托!
你可以随心所欲地做。模型不必局限于单个表,您可以从任何地方 JOIN、UNION 和 UPDATE 任何您喜欢的表。
为了进一步 Donny Kurnia 的建议,Jamie Rumbleow 已经编写了一个非常好的现有 MY_Model(我自己的一些贡献),其中包含几个 get、count、insert 等方法。这些允许您通过创建一个从 MY_Model 扩展的空模型来简单地完成最基本的 CRUD 要求。
这对于单表获取/插入/删除非常有用,但是在创建需要加入的方法时,最好的办法就是自己编写它们。
连接表时,您需要根据表名/别名设置 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);
}
}
这是我目前正在使用的一个非常简单的模型的示例,它显示了我将 MY_Model 用于 get、get_by、insert、update 与一些包含连接和额外数据的自定义方法相结合。
您还可以看到我重载了 insert() 以自动添加创建日期,而无需在可能正在创建或更新票证的每个控制器中设置它。
如果您需要更多神奇的自动细木工疯狂,请尝试使用Doctrine或DataMapper 之类的 ORM
我想分享我的方法。
首先,我创建了自己的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的数据库就足够了。一次学一个。