2

我只是对模型产生了怀疑...

这是我的第一个 100% MVC 项目(有点)......我的疑问是......当我对多个表进行连接、联合或任何功能时......我该怎么做?使用“主表”的相同模型文件,或者我需要使用两个或任何表创建一个新的模型文件?

Tkz...罗伯托!

4

2 回答 2

4

你可以随心所欲地做。模型不必局限于单个表,您可以从任何地方 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() 以自动添加创建日期,而无需在可能正在创建或更新票证的每个控制器中设置它。

如果您需要更多神奇的自动细木工疯狂,请尝试使用DoctrineDataMapper 之类的 ORM

于 2010-01-21T10:27:54.357 回答
3

我想分享我的方法。

首先,我创建了自己的MY_Model类,其中包含get_detailget_totalget_listget_allinsertupdatedelete方法。我把这个类放在文件夹文件system/application/libraries夹中。此类extendsCI 的 Model 类。此类中的所有相关查询都使用$this->tablename. 然后实际的模型类将只需要此代码即可使其工作:

class Product_model extends MY_Model {

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

}

当我需要加入 2 个或更多表时,我将代码放在主表的模型中。示例:我有productcategoryuser表。如果我需要获取产品,以及插入数据的类别名称和用户名,那么“主”表将是产品。我将在里面有这个方法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_joinedproduct表、category表和user表中返回列的函数。

首先确定主类很重要,以避免有多个方法做同样的事情。

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

于 2010-01-21T08:39:24.030 回答