狛ログ

2014年7月26日土曜日

CodeIgniterのActiveRecord(where句の動的生成)。

オフィス狛 技術部です。

前々回に引き続き、今回もCodeIgniterのActiveRecordで苦労した事を備忘録として残しておきます。

CodeIgniterのActiveRecordでは、
$this->db->where('item1', '1');
$this->db->where('item2', '2');
上記のように、カラムと検索値を指定するだけで、簡単にwhere句が作成できます。

ただし、複雑なSQL文の事を考慮し、動的にwhere句を作成する事もできます。
// 検索条件の作成
$whereString = ' ( item1 = ' . $value1;
$whereString.= '   or  item1 = ' . $value2 . ')';
$whereString.= ' and del_flg = ' . $delFlg;
$whereString.= ' and proc_date < ' . $nowDate;

$updateData = array(
        'del_flg' => self::NOT_DEL_DATA,
        'last_updated_user' => self::PRG_ID,
        'updated_at' => $updateTime,
);

$this->db->where($whereString);
$this->db->update('sample_table', $updateData);
上記は、変数whereStringにwhere句を動的作成して格納していますが、
実はエラーになってしまいます。(正しく解析されない)

原因は、whereStringの先頭に半角スペースが設定されている為です。
先頭の半角スペースを削除すれば、正常に動作します。

修正したものは以下になります。
(半角スペースだけの問題なので、パッと見は変わりませんが)
// 検索条件の作成
$whereString = '( item1 = ' . $value1;
$whereString.= '   or  item1 = ' . $value2 . ')';
$whereString.= ' and del_flg = ' . $delFlg;
$whereString.= ' and proc_date < ' . $nowDate;

$updateData = array(
        'del_flg' => self::NOT_DEL_DATA,
        'last_updated_user' => self::PRG_ID,
        'updated_at' => $updateTime,
);

$this->db->where($whereString);
$this->db->update('sample_table', $updateData);
これは、原因を突き止めるのに、本当に時間が掛かりました。

, ,

0 件のコメント:

コメントを投稿