CodeigniterのModelにおいてget_where()でJOINする方法

現在スマートフォンアプリ開発に携わっているのですが、その構成が

スマートフォンアプリ:Phonegap + Onsen UI
サーバー(管理画面およびAPI):Codeigniter + React

というようになっています。細かく言えばjQueryやSassなど他のライブラリも使っていますが、大まかには上記です。

もちろんSQL(MySQL)も利用しているのですが、ここまでは基本的な使い方しかしていませんでした。SELECTやUPDATE、INSERT、WHERE、ORDER BYなど基本中の基本だけです。

で、進めていく中で、ついにJOINを使うべき時が!!!

というほど大げさなものでもないですが、今までCodeigniterのModelではテーブルの結合をしたことがなかったので、少し調べる必要がありました。

というわけでそれについてメモ的に書いておこうと思います。

単純にSELECTする場合

JOINを使わなくても良かった時は以下のような感じで、本当に単純にSELECTしていただけです。

$query = $this->db->get_where('tableA', array('id' => $id, 'flag' => 0));
$result = $query->result('array');

ちなみに、見て判る通り私はget_where()派です。

このくらいのことだけで最後までいけたらな~と思っていましたが、さすがにそれは無理でした。

JOINを使う場合

join()というfunctionがあること、引数にテーブル名と条件を加えるであろうことは予想はついていましたが、具体的なコードは当然ながら判らず。

調べたらあまり難しくはありませんでした。get_where()の前にjoin()を追加するだけです。

$where = array('id' => $id, 'flag' => 0);
$join = array('tableB', 'tableA.id=tableB.tableA_id');
$query = $this->db->join($join[0], $join[1])->get_where( 'tableA', $where );
$result = $query->result('array');

なおLEFT JOINなどの結合が必要な場合にはjoin()の第3引数に指定することができます。

$this->db->join($join[0], $join[1], 'left');

指定ができるのは以下6つです。

  • left
  • right
  • outer
  • inner
  • left outer
  • right outer

また、ここでは書きませんが、get()とwhere()を別に使う場合もjoin()部分は同様です。

2つのテーブルに同じフィールド名がある場合

今回私が一番迷ったのが、tableAとtableBに同じ名称のフィールドがあったことです。

普通のSQLならSELECTで別名をつければ良い話だとすぐに気づける(はずな)のですが、Codeigniterでどうしたら良いか迷いました。

これも他と同様にselect()でフィールドに別名をつければOKでした。

$where = array('id' => $id, 'flag' => 0);
$join = array('tableB', 'tableA.id=tableB.tableA_id');
$field = array(
  'tableA.id AS tableA_id',
  'tableB.id AS tableB_id',
  'tableA.name AS tableA_name',
  'tableB.name AS tableB_name',
  ~~~
  // 必要なフィールドを全て列挙
  ~~~
);
$query = $this->db->select(implode(',', $field))->join($join[0], $join[1])->get_where( 'tableA', $where );
$result = $query->result('array');

ほぼSQLそのままの関数が用意されている

CodeigniterのModelにはSQL文と同じ名称、またはすぐ予想がつくような名称のfunctionが用意されています。

なので、そのルールに慣れてしまえば良いはずなのですが、それでも一瞬迷うことはあります。

全部を完璧に覚えていればベストですがそれもまた難しいので、やはり基本的なルールを覚えておいてあとは調べつつ進める、ということになると思います。

スポンサードリンク

twitterまたはFacebookでもコメントして頂けます