現在スマートフォンアプリ開発に携わっているのですが、その構成が
スマートフォンアプリ: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が用意されています。
なので、そのルールに慣れてしまえば良いはずなのですが、それでも一瞬迷うことはあります。
全部を完璧に覚えていればベストですがそれもまた難しいので、やはり基本的なルールを覚えておいてあとは調べつつ進める、ということになると思います。