Add SqlCriteria class. Add SqlModel.find() with use SqlCriteria.
This commit is contained in:
86
model/SqlCriteria.php
Normal file
86
model/SqlCriteria.php
Normal file
@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
class SqlCriteria
|
||||
{
|
||||
public $select = array('*');
|
||||
|
||||
public $distinct = '';
|
||||
|
||||
public $where = array();
|
||||
|
||||
public $order = array();
|
||||
|
||||
public $limit = '';
|
||||
|
||||
/**
|
||||
* @return SqlCriteria
|
||||
*/
|
||||
public static function getInstance()
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $conditions array @ex array('field=?' => $value, 'field in ? => new DbExpr('(1,2,3)'))
|
||||
* @return SqlCriteria
|
||||
*/
|
||||
public function where($conditions)
|
||||
{
|
||||
$this->where = $conditions;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $fields array()
|
||||
* @param array $fields_to_desc
|
||||
* @return SqlCriteria
|
||||
*/
|
||||
public function order($fields, $fields_to_desc = array())
|
||||
{
|
||||
if (!is_array($fields)) {
|
||||
$fields = array($fields);
|
||||
}
|
||||
foreach ($fields as $term) {
|
||||
$term = $this->db->quoteIdentifier($term) . (in_array($term, $fields_to_desc) ? ' DESC' : '');
|
||||
}
|
||||
$this->order = implode(',', $fields);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $limit int
|
||||
* @param $offset int
|
||||
* @return SqlCriteria
|
||||
*/
|
||||
public function limit($limit, $offset = 0)
|
||||
{
|
||||
if (empty($offset)) {
|
||||
$this->limit = (int) $limit;
|
||||
}
|
||||
$this->limit = (int)$limit . ',' . (int) $offset;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $select array @ex array('field1', 'field2', 'field3' => 'field')
|
||||
* @return string
|
||||
*/
|
||||
public function select($select)
|
||||
{
|
||||
if (!is_array($select)) {
|
||||
$select = array($select);
|
||||
}
|
||||
$this->select = implode(',', $select);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $field string
|
||||
* @return SqlCriteria
|
||||
*/
|
||||
public function distinct($field)
|
||||
{
|
||||
$this->distinct = $field;
|
||||
return $this;
|
||||
}
|
||||
}
|
@ -15,7 +15,6 @@
|
||||
*/
|
||||
abstract class SqlModel extends Model
|
||||
{
|
||||
|
||||
/**
|
||||
* @param string $ident
|
||||
* @return string Quoted identifier.
|
||||
@ -177,5 +176,36 @@ abstract class SqlModel extends Model
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param $criteria SqlCriteria
|
||||
*/
|
||||
public function find($criteria)
|
||||
{
|
||||
foreach ($criteria->select as $field => &$term) {
|
||||
if (is_int($field)) {
|
||||
$term = $this->db->quoteIdentifier($term);
|
||||
} else {
|
||||
$term = $this->db->quoteIdentifier($field) . ' as ' . $this->db->quoteIdentifier($term);
|
||||
}
|
||||
}
|
||||
foreach ($criteria->where as $cond => &$term) {
|
||||
$term = $this->db->quoteInto($cond, $term);
|
||||
}
|
||||
foreach ($criteria->order as $field => $term) {
|
||||
if (!is_int($field) && $term == 'desc') {
|
||||
$term = $term = $this->db->quoteIdentifier($field) . ' DESC';
|
||||
} else {
|
||||
$term = $this->db->quoteIdentifier($term);
|
||||
}
|
||||
}
|
||||
if ($criteria->distinct != '') {
|
||||
$criteria->distinct = 'DISTINCT ' . $this->db->quoteIdentifier($criteria->distinct);
|
||||
}
|
||||
$sql = '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)))) : '');
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user