Refactoring SqlModel.find() add SqlModel.criteria(). Add critera data keys as constants in SqlModel.
This commit is contained in:
@ -15,6 +15,24 @@
|
|||||||
*/
|
*/
|
||||||
abstract class SqlModel extends Model
|
abstract class SqlModel extends Model
|
||||||
{
|
{
|
||||||
|
const SELECT = 10;
|
||||||
|
const DISTINCT = 11;
|
||||||
|
const WHERE = 12;
|
||||||
|
const ORDER = 13;
|
||||||
|
const ORDER_TO_DESC = 14;
|
||||||
|
const LIMIT = 15;
|
||||||
|
const OFFSET = 16;
|
||||||
|
|
||||||
|
protected static $criteria_data_keys = array(
|
||||||
|
self::SELECT,
|
||||||
|
self::DISTINCT,
|
||||||
|
self::WHERE,
|
||||||
|
self::ORDER,
|
||||||
|
/** self::ORDER_TO_DESC, // no to be process in foreach criteria_data @see SqlModel::find() */
|
||||||
|
self::LIMIT,
|
||||||
|
/** self::OFFSET // no to be process in foreach criteria_data @see SqlModel::find() */
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $ident
|
* @param string $ident
|
||||||
* @return string Quoted identifier.
|
* @return string Quoted identifier.
|
||||||
@ -179,8 +197,9 @@ abstract class SqlModel extends Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $criteria SqlCriteria
|
* @param $criteria SqlCriteria
|
||||||
|
* @return string Sql string expression
|
||||||
*/
|
*/
|
||||||
public function find($criteria)
|
protected function criteria($criteria)
|
||||||
{
|
{
|
||||||
foreach ($criteria->select as $field => &$term) {
|
foreach ($criteria->select as $field => &$term) {
|
||||||
if (is_int($field)) {
|
if (is_int($field)) {
|
||||||
@ -202,10 +221,48 @@ abstract class SqlModel extends Model
|
|||||||
if ($criteria->distinct != '') {
|
if ($criteria->distinct != '') {
|
||||||
$criteria->distinct = 'DISTINCT ' . $this->db->quoteIdentifier($criteria->distinct);
|
$criteria->distinct = 'DISTINCT ' . $this->db->quoteIdentifier($criteria->distinct);
|
||||||
}
|
}
|
||||||
$sql = 'SELECT ' . (($criteria->distinct) ? $criteria->distinct : implode(',', $criteria->select))
|
return 'SELECT ' . (($criteria->distinct) ? $criteria->distinct : implode(',', $criteria->select))
|
||||||
. ' FROM ' . $this->db->quoteIdentifier($this->table)
|
. ' FROM ' . $this->db->quoteIdentifier($this->table)
|
||||||
. (($criteria->where) ? (' WHERE ' . implode(' AND ', $criteria->where)) : '')
|
. (($criteria->where) ? (' WHERE ' . implode(' AND ', $criteria->where)) : '')
|
||||||
. (($criteria->order) ? (' ORDER BY ' . implode(',', $criteria->order)) : '')
|
. (($criteria->order) ? (' ORDER BY ' . implode(',', $criteria->order)) : '')
|
||||||
. (($criteria->limit) ? (' LIMIT ' . implode(',',array_map(function($item){return intval($item);},explode(',',$criteria->limit)))) : '');
|
. (($criteria->limit) ? (' LIMIT ' . implode(',',array_map(function($item){return intval($item);},explode(',',$criteria->limit)))) : '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $criteria_data array
|
||||||
|
* @ex array(
|
||||||
|
* SqlModel::SELECT => '*',
|
||||||
|
* SqlModel::WHERE => array('field=?', 1),
|
||||||
|
* SqlModel::ORDER => array('last_name', 'first_name'),
|
||||||
|
* SqlModel::ORDER_TO_DESC => array('last_name'),
|
||||||
|
* SqlModel::LIMIT => 10)
|
||||||
|
* @return mixed|DbStatement[]
|
||||||
|
*/
|
||||||
|
public function find($criteria_data)
|
||||||
|
{
|
||||||
|
$criteria = new SqlCriteria();
|
||||||
|
foreach (self::$criteria_data_keys as $criteria_data_key) {
|
||||||
|
if (isset($criteria_data[$criteria_data_key])) {
|
||||||
|
$value = $criteria_data[$criteria_data_key];
|
||||||
|
switch ($criteria_data_key) {
|
||||||
|
case self::SELECT:
|
||||||
|
$criteria->select($value);
|
||||||
|
break;
|
||||||
|
case self::DISTINCT:
|
||||||
|
$criteria->distinct($value);
|
||||||
|
break;
|
||||||
|
case self::WHERE:
|
||||||
|
$criteria->where($value);
|
||||||
|
break;
|
||||||
|
case self::ORDER:
|
||||||
|
$criteria->order($value, ((isset($criteria_data[self::ORDER_TO_DESC])) ? $criteria_data[self::ORDER_TO_DESC] : null));
|
||||||
|
break;
|
||||||
|
case self::LIMIT:
|
||||||
|
$criteria->limit($value, ((isset($criteria_data[self::OFFSET])) ? $criteria_data[self::OFFSET] : null));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return self::fetchAll($this->criteria($criteria));
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user