2

私はモデルについてこの疑問を抱きました...

これは私の最初の100%MVCプロジェクト(一種)です...私の疑問は...病気のときに結合、結合、または複数のテーブルを持つ関数を実行するとき...これをどのように行うのですか?「メインテーブル」と同じモデルファイルを使用するか、2つまたは任意のテーブルを使用して新しいモデルファイルを作成する必要がありますか?

Tkz ...ロベルト!

4

2 に答える 2

4

好きなようにできます。モデルは単一のテーブルに限定される必要はありませんどこからでも好きなテーブルに参加、UNION、および更新できます。

Donny Kurniaの提案をさらに進めるために、非常に優れた既存のMY_Modelは、いくつかのget、count、insertなどのメソッドを含むJamie Rumbleowによってすでに作成されています(私自身からのいくつかの貢献があります)。これらを使用すると、MY_Modelから拡張する空のモデルを作成することで、最も基本的なCRUD要件を簡単に実行できます。

これは、1つのテーブルの取得/挿入/削除には最適ですが、結合が必要なメソッドを作成する場合は、自分で作成するのが最善の方法です。

テーブルを結合するときは、テーブル名/エイリアスに基づいて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、insert、updateのMY_Modelの使用と、結合と追加データを含むいくつかのカスタムメソッドを組み合わせたものです。

また、insert()をオーバーロードして、チケットを作成または更新している可能性のある各コントローラーで設定しなくても、作成日を自動的に追加することもできます。

さらに魔法の自動ジョイナリーマッドネスが必要な場合は、DoctrineDataMapperなどでORMを試してください

于 2010-01-21T10:27:54.357 に答える
3

このための私のアプローチを共有したいと思います。

まず、、、、、、、、およびメソッドを持つ独自のMY_Modelクラスを作成しました。このクラスをフォルダフォルダに入れました。このクラスCIのModelクラス。を使用したこのクラスのすべての関連クエリ。次に、実際のモデルクラスは、それを機能させるためにこのコードのみを必要とします。get_detailget_totalget_listget_allinsertupdatedeletesystem/application/librariesextends$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_joinedproductcategoryuser

同じことを行う複数のメソッドがないように、最初にメインクラスを決定することが重要です。

結合するには、CIに含まれているデータベースクラスで十分です。しかし、私はデータベースライブラリとしてAdoDBを使用することを好みます。CIよりも多くのデータベースサポートを提供します。ただし、最初はmysqlのみを使用する場合は、CIのデータベースで十分です。一度に1つずつ学びましょう。

于 2010-01-21T08:39:24.030 に答える