2007年11月16日

CodeIgniterでModelを作ってみる

前回まででようやく検索結果のページング表示ができましたが、Controllerクラスが若干ぐちゃぐちゃになってきたので、ここらでそろそろModelクラスを作って、データベース関連の部分はそっちにコードを移行しようとおもいます。

で、ユーザガイドのModelのところを見ると、なにやらModelクラスを継承してはいるようですが、特に取得系や保存系?のメソッドがあるわけでもなく、特定のテーブルと結びついてるというわけでもなく、継承元のModelクラスみたいな?のがlibrariesフォルダにあったので(Model.php)チラ見してみましたがMagicメソッドがどーのこーのでわけがわからず(--;

仕方がないので(謎杉)modelsフォルダの中にgappei_model.phpというファイルを作ってみました。
class Gappei_model extends Model {
function Gappei_model()
{
parent::Model();
}
}

果たしてこんなのでいいのか?という毎度の不安の中、とりあえずdbから件数を取得するコードとデータを取得するコードを適当なメソッドをでっちあげて書きました。

件数取得
function getCount($criteria)
{
$this->db->select('DISTINCT nid, pref, nc, yomi, gdate');
$this->db->from('cities');
$this->db->like('nc', $criteria);

$count = $this->db->get()->num_rows();

return $count;
}

検索条件を引数に件数を返すメソッドです。検索条件は今のところ新市町村のみですのでlike節?は決め打ちっつーか'nc'で固定です。

次に結果データ取得メソッドですが、VIEWの方もいい加減print_rでは見難いので、多次元配列に格納して、VIEWでテーブル表示にしてみたいとおもいます。ということでまず結果を多次元配列に格納して返すプライベートメソッドを定義します。
private function formatData($result)
{
$data = '';

//nidをキーに多次元配列化
if ($result->num_rows() > 0) {
foreach ($result->result_array() as $row)
{
$data[$row['nid']]['nid'] = $row['nid'];
$data[$row['nid']]['pref'] = $row['pref'];
$data[$row['nid']]['ncity'] = $row['nc'];
$data[$row['nid']]['ocity'][$row['oid']]['oid'] = $row['oid'];
$data[$row['nid']]['ocity'][$row['oid']]['oc'] = $row['oc'];
$data[$row['nid']]['date'] = $row['gdate'];
}

$data = array_values($data); //歯抜けキーを連続に
}

return $data;
}

次にControllerから呼ばれる(予定の)データ取得メソッド
function getData($offset, $limit)
{
//サブクエリ組立
$subQuery = "(".$this->db->last_query()." LIMIT $offset, $limit) AS vn";

//結果取得SQL
$this->db->select('nid, pref, nc, o.id oid, o.city oc, gdate');
$this->db->from($subQuery);
$this->db->join('newcities_oldcities j', 'vn.nid = j.newcity_id');
$this->db->join('oldcities o', 'o.id = j.oldcity_id');

//結果取得
$formattedData = $this->formatData($this->db->get());

return $formattedData;
}

オフセットとリミットを引数にして多次元配列に格納したデータを返します。先に作ったPrivateFunction(=formatData)を途中で呼び出しています。

FROM句のサブクエリを組み立てる際に$this->db->last_query()というメソッドを使っていますが、これは直前のクエリ(SQL文)を返します。流れとしては先に件数を取得してそれとほぼ同じ(LIMIT句を加えただけの)クエリをデータ取得で使うので、なんとなくこの二つのメソッドの間に何か別のクエリが実行されたらヤバゲじゃん?な感じですが、とりあえずこれでよしとしておきます(^^;。

次にControllerですが、まずmodelクラスをロードして、dbのクエリ組立部分をごっそり削除します。そして新たにmodelクラスのメソッドを呼び出すようにします。
class Gappei extends Controller {
function Gappei()
{
parent::controller();
$this->load->library('phpsession');
$this->load->helper('form');
$this->load->helper('url');
}

function search()
{
$this->phpsession->save('newcity', $this->input->post('newcity'));
redirect('gappei/index/');
}

function index($offset=0)
{
//モデルロード
$this->load->model('Gappei_model', 'Gdb');

//ページャーロード
$this->load->library('pagination');

$data['title'] = "平成市町村合併";
$data['heading'] = "平成市町村合併";

//セッションから検索条件取得
$data['newcity'] = ($this->phpsession->get('newcity') <> "") ? $this->phpsession->get('newcity') : "";

//件数取得
$count = $this->Gdb->getCount($data['newcity']);

//データ取得
$data['datas'] = $this->Gdb->getData($offset, 10);

//ページング
$config['base_url'] = 'http://localhost/mount_u/codeigniter/index.php/gappei/index/';
$config['total_rows'] = $count;
$config['per_page'] = '10';

$this->pagination->initialize($config);

//ビューロード
$this->load->view('gappei_view', $data);

//デバッグ
$this->output->enable_profiler(TRUE);
}
}

Modelをロードしている所の第2引数はModelの別名です。$this->Gdb->getCount()のように使用できます。セッションから検索条件を取得している部分は三項演算子で書き直しています。

またデータ取得の部分で、以前は$data['query']に格納してVIEW側で$query->result_array()みたいにしていましたが、すでにModelで多次元配列を返すようにしましたので、$data['datas']に格納することにしてVIEW側では単に表示処理(具体的にはHTMLのTableタグ付け)だけにします。

VIEW
<pre>
<?foreach($query->result_array() as $row):?>
<?=print_r($row, 1)?>
<?endforeach;?>
</pre>
 ↓
<pre><?=print_r($datas, 1)?></pre>

そして表示結果
model.png
ってか結局まだprint_rじゃん(--; ってなわけで次回はテーブルに整形するところから…。
ラベル:codeigniter
posted by ciallost at 01:34| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。