/** * WHERE条件文を生成する * * @access public * @param string $field 検索対象のフィールド * @param mixed $value 検索値 * @param int $condition 検索条件(OBJECT_CONDITION_NE,...) * @return string 検索条件文 * @static */ function getCondition($field, $value, $condition = OBJECT_CONDITION_EQ) { switch ($condition) { case OBJECT_CONDITION_EQ: $op = "="; break; case OBJECT_CONDITION_NE: $op = "!="; break; case OBJECT_CONDITION_LIKE: $op = "LIKE"; break; case OBJECT_CONDITION_GT: $op = ">"; break; case OBJECT_CONDITION_LT: $op = "<"; break; case OBJECT_CONDITION_GE: $op = ">="; break; case OBJECT_CONDITION_LE: $op = "<="; break; } // default operand $operand = $value; if (is_array($value)) { if (count($value) > 0) { switch ($condition) { case OBJECT_CONDITION_EQ: $op = "IN"; break; case OBJECT_CONDITION_NE: $op = "NOT IN"; break; } $operand = sprintf("(%s)", implode(',', $value)); } else { // always be false $op = "="; $operand = "NULL"; } } else { if ($value == 'NULL') { switch ($condition) { case OBJECT_CONDITION_EQ: $op = "IS"; break; case OBJECT_CONDITION_NE: $op = "IS NOT"; break; } } if ($condition == OBJECT_CONDITION_LIKE) { Ethna_AppSQL::unescapeSQL($value); $value = '%' . str_replace('%', '\\%', $value) . '%'; Ethna_AppSQL::escapeSQL($value); $operand = $value; } } return "{$field} {$op} {$operand}"; }
/** * 検索条件SQL文を返す * * @access public * @param string 検索対象カラム名 * @return SQL文 */ function toString($column) { $condition = "("; $tmp_value = $this->value; Ethna_AppSQL::escapeSQL($tmp_value); $condition .= Ethna_AppSQL::getCondition("{$column}", $tmp_value, $this->condition); foreach ($this->object_list as $elt) { if ($elt['condition'] == OBJECT_CONDITION_OR) { $condition .= " OR "; } else { $condition .= " AND "; } $condition .= $elt['object']->toString($elt['name']); } return $condition . ")"; }
/** * オブジェクト検索SQLの条件文を構築する * * @access private * @param array $filter WHERE検索条件(カラム名をキー、値には実際の条件値か、Ethna_AppSearchObjectを指定) * @return string オブジェクト検索の条件文(エラーならnull) */ function _getSQL_SearchCondition($filter) { if (is_array($filter) == false) { return ""; } $p_table = $this->_getPrimaryTable(); // 検索用追加プロパティ // プライマリーキー以外の検索キーが含まれていた // 場合は、その解釈を _SQLPlugin_SearchPropDef に任せる // // これによって、複数のテーブルの条件を指定することが // できる(一応. ダサいけど) if ($this->_isAdditionalField($filter)) { $search_prop_def = $this->_SQLPlugin_SearchPropDef(); } else { $search_prop_def = array(); } $prop_def = array_merge($this->prop_def, $search_prop_def); $condition = null; foreach ($filter as $k => $v) { if (isset($prop_def[$k]) == false) { trigger_error(sprintf("Unknown property [%s]", $k), E_USER_ERROR); return null; } if (is_null($condition)) { $condition = "WHERE "; } else { $condition .= " AND "; } $t = isset($prop_def[$k]['table']) ? $prop_def[$k]['table'] : $p_table; // 細かい条件を指定するには、Ethna_AppSearchObject // を使う必要がある 文字列の場合は LIKE, 数値の場合 // は = 条件しか指定できないからである。 if (is_object($v)) { // Ethna_AppSearchObjectが指定されている場合 $condition .= $v->toString($this->my_db_ro->quoteIdentifier($t) . '.' . $this->my_db_ro->quoteIdentifier($k)); } else { if (is_array($v) && count($v) > 0 && is_object($v[0])) { // Ethna_AppSearchObjectが配列で指定されている場合 $n = 0; foreach ($v as $so) { if ($n > 0) { $condition .= " AND "; } $condition .= $so->toString($this->my_db_ro->quoteIdentifier($t) . '.' . $this->my_db_ro->quoteIdentifier($k)); $n++; } } else { if ($prop_def[$k]['type'] == VAR_TYPE_STRING) { // 省略形(文字列) Ethna_AppSQL::escapeSQL($v, $this->my_db_type); $condition .= Ethna_AppSQL::getCondition($this->my_db_ro->quoteIdentifier($t) . '.' . $this->my_db_ro->quoteIdentifier($k), $v, OBJECT_CONDITION_LIKE); } else { // 省略形(数値) Ethna_AppSQL::escapeSQL($v, $this->my_db_type); $condition .= Ethna_AppSQL::getCondition($this->my_db_ro->quoteIdentifier($t) . '.' . $this->my_db_ro->quoteIdentifier($k), $v, OBJECT_CONDITION_EQ); } } } } return $condition; }
/** * オブジェクト検索SQLの条件文を構築する * * @access private * @param array $filter 検索条件 * @return string オブジェクト検索の条件文(エラーならnull) */ function _getSQL_SearchCondition($filter) { if (is_array($filter) == false) { return ""; } $p_table = $this->_getPrimaryTable(); // 検索用追加プロパティ if ($this->_isAdditionalField($filter)) { $search_prop_def = $this->_SQLPlugin_SearchPropDef(); } else { $search_prop_def = array(); } $prop_def = array_merge($this->prop_def, $search_prop_def); $condition = null; foreach ($filter as $k => $v) { if (isset($prop_def[$k]) == false) { trigger_error(sprintf("Unknown property [%s]", $k), E_USER_ERROR); return null; } if (is_null($condition)) { $condition = "WHERE "; } else { $condition .= " AND "; } $t = isset($prop_def[$k]['table']) ? $prop_def[$k]['table'] : $p_table; if (is_object($v)) { // Ethna_AppSearchObjectが指定されている場合 $condition .= $v->toString("{$t}.{$k}"); } else { if (is_array($v) && count($v) > 0 && is_object($v[0])) { // Ethna_AppSearchObjectが配列で指定されている場合 $n = 0; foreach ($v as $so) { if ($n > 0) { $condition .= " AND "; } $condition .= $so->toString("{$t}.{$k}"); $n++; } } else { if ($prop_def[$k]['type'] == VAR_TYPE_STRING) { // 省略形(文字列) Ethna_AppSQL::escapeSQL($v); $condition .= Ethna_AppSQL::getCondition("{$t}.{$k}", $v, OBJECT_CONDITION_LIKE); } else { // 省略形(数値) Ethna_AppSQL::escapeSQL($v); $condition .= Ethna_AppSQL::getCondition("{$t}.{$k}", $v, OBJECT_CONDITION_EQ); } } } } return $condition; }
/** * @link http://www.bpsinc.jp/blog/archives/223 */ 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 (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; }