EthnaのAppObjectネタです。
add()
したあと、auto_increment
で決定されたIDに応じて会員番号を生成する、といったときに、AppObjectのadd()
をオーバーライドして、
class Appid_UserAppObject extends Appid_AppObject
{
//オーバーライド
function add()
{
parent::add();
//会員番号numberは、t+6桁の連番とする
$this->set('number', sprintf('t%06d', $this->get('id')));
$this->update();
}
}
としたいものですが、これだとupdate
の時にSQLエラーが出ることがあります。
このエラーは、プロパティにNULLが含まれているときに、中途半端なSQLが生成されているのが原因です。
解決
これに対処するには、Appid_AppObject
で、以下の関数をオーバーライドします。
/**
* オブジェクトプロパティを更新するSQL文を構築する
*
* @access private
* @return オブジェクトプロパティを更新するためのUPDATE文
*/
function _getSQL_Update()
{
$tables = implode(',',
$this->my_db_rw->quoteIdentifier(array_keys($this->table_def)));
// SET句構築
$set_list = "";
$prop_arg_list = $this->prop;
Ethna_AppSQL::escapeSQL($prop_arg_list, $this->my_db_type);
foreach ($this->prop_def as $k => $v) {
//この下のif文を追加
if (isset($prop_arg_list[$k]) && $prop_arg_list[$k] !== null && $prop_arg_list[$k] !== '') {
if ($set_list != "") {
$set_list .= ",";
}
$set_list .= sprintf("%s=%s",
$this->my_db_rw->quoteIdentifier($k),
$prop_arg_list[$k]);
}
}
// 検索条件(primary key)
$condition = null;
foreach (to_array($this->id_def) as $k) {
if (is_null($condition)) {
$condition = "WHERE ";
} else {
$condition .= " AND ";
}
$v = $this->prop_backup[$k]; // equals to $this->id
Ethna_AppSQL::escapeSQL($v, $this->my_db_type);
$condition .= Ethna_AppSQL::getCondition(
$this->my_db_rw->quoteIdentifier($k), $v);
}
$sql = "UPDATE $tables SET $set_list $condition";
return $sql;
}
UPDATE
文を生成するときに、値がセットされていないものをSETしないようにif
文を追加しただけです。