私はモデルについてこの疑問を抱きました...
これは私の最初の100%MVCプロジェクト(一種)です...私の疑問は...病気のときに結合、結合、または複数のテーブルを持つ関数を実行するとき...これをどのように行うのですか?「メインテーブル」と同じモデルファイルを使用するか、2つまたは任意のテーブルを使用して新しいモデルファイルを作成する必要がありますか?
Tkz ...ロベルト!
私はモデルについてこの疑問を抱きました...
これは私の最初の100%MVCプロジェクト(一種)です...私の疑問は...病気のときに結合、結合、または複数のテーブルを持つ関数を実行するとき...これをどのように行うのですか?「メインテーブル」と同じモデルファイルを使用するか、2つまたは任意のテーブルを使用して新しいモデルファイルを作成する必要がありますか?
Tkz ...ロベルト!
好きなようにできます。モデルは単一のテーブルに限定される必要はありません。どこからでも好きなテーブルに参加、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()をオーバーロードして、チケットを作成または更新している可能性のある各コントローラーで設定しなくても、作成日を自動的に追加することもできます。
さらに魔法の自動ジョイナリーマッドネスが必要な場合は、DoctrineやDataMapperなどでORMを試してください
このための私のアプローチを共有したいと思います。
まず、、、、、、、、およびメソッドを持つ独自のMY_Model
クラスを作成しました。このクラスをフォルダフォルダに入れました。このクラスCIのModelクラス。を使用したこのクラスのすべての関連クエリ。次に、実際のモデルクラスは、それを機能させるためにこのコードのみを必要とします。get_detail
get_total
get_list
get_all
insert
update
delete
system/application/libraries
extends
$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のデータベースで十分です。一度に1つずつ学びましょう。