CodeIginter(3.0.3)のjoin()の仕様

一つ前の投稿(『CodeIginter(3.0.3)のjoin()で遭遇したこと』)の追記。

どうやら、CodeIgniterでjoin()を使用した際に、joinするテーブル同士に同名のカラムがあった場合、from等は関係なく、最後にjoinされたテーブルのカラムが優先される模様。

※例えば、joinするテーブルAとテーブルBの、どちらにもcreated_at(作成日)カラムがある場合など。

なので、同名のカラムがある場合は、どのテーブルのカラムを使うのか、select()で明示してやる必要があるようです。

CodeIginter(3.0.3)のjoin()で遭遇したこと

今後のために勉強していたCodeIgniterで、バグなのか自分の理解が足らずにおかしな挙動になったのかはわからないけど、変な現象に行き当たったので、忘れた時のためにメモ。

■内容
joinしてselectした結果の、ユニーク列の値が全て同じ値(全部1)になった。

■例
前提として、一対一の関係になっている以下の様なテーブルがあるとします。

・テーブルA
id,col1,テーブルB_id
1,test1,1
2,test2,2

・テーブルB
id,col2,col3
1,test1_title,test1_text
2,test2_title,test2_text

これを、joinで繋げて変数に格納しようとした時に、以下のようにすると、『内容』に書いてあるような事例に遭遇しました。

$this->db->select('*');
$this->db->from('テーブルA');
$this->db->join('テーブルB', 'テーブルB.id = テーブルA.テーブルB_id
$query = $this->db->get()->result_array();

$queryの中身(実際は配列)

id,col1,テーブルB_id,テーブルB.id,col2,col3
1,test1,1,test1_title,test1_text
1,test2,2,test2_title,test2_text

↑『id』カラムの値が全て同じ値になってしまう。
 
 
これを回避するには、以下のようにします。

$this->db->select('*');
$this->db->select('テーブルA.id'); // ←追加
$this->db->from('テーブルA');
$this->db->join('テーブルB', 'テーブルB.id = テーブルA.テーブルB_id
$query = $this->db->get()->result_array();

$queryの中身(実際は配列)

id,col1,テーブルB_id,テーブルB.id,col2,col3
1,test1,1,test1_title,test1_text
2,test2,2,test2_title,test2_text

↑正しいデータになる。
 
 
末尾にテーブルAのidを追加して、それを参照すれば良いかと思って記述を追加したら、何故か出力結果のカラムは同じままデータだけが正しい状態になりました。
おそらく、joinしたテーブル同士のユニーク列の名前被りが原因で起こるバグなのではないかと思いますが、詳しいところはわかっていません。

フルリニューアル

今まで年単位で放置していた本サイト(ayahumi.com)を、フレームワークの練習がてらに、CodeIgniterでフルリニューアルしてみました。

ついでに、サーバーのPHPのバージョンを上げたらログインが動かなくなって新しい写真が投稿できなくなったフォトサイト(photo.ayahumi.com)も本サイト内に統合。

リニューアル前のサイトは、まだCGI全盛期の、フレームワークなんてStrutsがやっと世の中に認知され始めたかなくらいの頃に、力技でJavaScriptだけでヘッダーやフッターのテンプレート化をした、そこそこ思い出深い造りのサイトなので、一応しばらくは消さずに取っておきます。
まだドメイン設定したてで表示されないけど、old.ayahumi.comにて公開中。

デザインは載せてないし、コンテンツも何の変わりもありませんが、パッと見の見た目と動きは、そこそこ今風になったんじゃないかと思います。