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
|
||||
{
|
||||
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
|
||||
* @return string Quoted identifier.
|
||||
@ -179,8 +197,9 @@ abstract class SqlModel extends Model
|
||||
|
||||
/**
|
||||
* @param $criteria SqlCriteria
|
||||
* @return string Sql string expression
|
||||
*/
|
||||
public function find($criteria)
|
||||
protected function criteria($criteria)
|
||||
{
|
||||
foreach ($criteria->select as $field => &$term) {
|
||||
if (is_int($field)) {
|
||||
@ -202,10 +221,48 @@ abstract class SqlModel extends Model
|
||||
if ($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)
|
||||
. (($criteria->where) ? (' WHERE ' . implode(' AND ', $criteria->where)) : '')
|
||||
. (($criteria->order) ? (' ORDER BY ' . implode(',', $criteria->order)) : '')
|
||||
. (($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