@ -2,6 +2,20 @@
class SqlCriteria
{
const JOIN_TYPE_DEFAULT = 100 ;
const JOIN_TYPE_LEFT = 101 ;
const JOIN_TYPE_RIGHT = 102 ;
const JOIN_TYPE_INNER = 103 ;
const JOIN_TYPE_OUTER = 104 ;
private static $join_type_to_reserved_keyword = array (
self :: JOIN_TYPE_DEFAULT => 'JOIN' ,
self :: JOIN_TYPE_LEFT => 'LEFT JOIN' ,
self :: JOIN_TYPE_RIGHT => 'RIGHT JOIN' ,
self :: JOIN_TYPE_INNER => 'INNER JOIN' ,
self :: JOIN_TYPE_OUTER => 'OUTER JOIN' ,
);
private $select = array ();
private $distinct = '' ;
@ -23,6 +37,8 @@ class SqlCriteria
private $sql_expression_params = array ();
private $sql_join_expressions = array ();
/**
* @ param $model SqlModel
* @ param $sql_expression string | null Sql expression with SELECT and FROM operators . If fetched , then SqlCriteria :: select (), SqlCriteria :: distinct () disabled for use .
@ -40,14 +56,39 @@ class SqlCriteria
*/
public function find ()
{
// preparing link expressions (if exists)
if ( $this -> sql_join_expressions ) {
if ( ! $this -> sql_expression ) {
$select = $this -> model -> getDb () -> selectExpr ( $this -> select , $this -> distinct );
$this -> sql_expression = 'SELECT ' . $select . ' FROM :table' ;
}
$this -> sql_expression .= ' ' . implode ( ' ' , $this -> sql_join_expressions );
}
return $this -> model -> find ( $this -> select , $this -> distinct , $this -> where , $this -> order , $this -> limit , null , $this -> group_by , $this -> sql_expression , $this -> sql_expression_params );
}
public function delete ()
{
return $this -> model -> find ( '' , '' , $this -> where , null , null , null , null , 'DELETE FROM :table' , $this -> sql_expression_params ) -> affectedRows ();
}
public function count ()
{
return $this -> model -> find ( new DbExpr ( 'COUNT(*) as count' ), '' , $this -> where , null , null , null , null , $this -> sql_expression , $this -> sql_expression_params ) -> fetchField ( 'count' );
}
public function join ( $join_table_name , $join_field_name , $donor_table_name = null , $donor_field_name = null , $join_type = self :: JOIN_TYPE_DEFAULT )
{
$donor_field_name = $donor_field_name ? : $join_field_name ;
$donor_table_name = $donor_table_name ? : 'table' ;
$this -> sql_join_expressions [] = self :: $join_type_to_reserved_keyword [ $join_type ]
. ' :' . $join_table_name
. ' ON :' . $donor_table_name . '.' . $donor_field_name . '='
. ':' . $join_table_name . '.' . $join_field_name ;
$this -> sql_expression_params [ $join_table_name ] = new DbExpr ( $this -> model -> identify ( $join_table_name ));
return $this ;
}
/**
* @ param $cond string | array Condition with " ? " placeholder @ ex 'field=?' or 'field=1' or array ( 'field=?' => 1 ', ' field = 1 ' )
* @ param $value string | array | DbExpr | null Value . Array transformed to DbExpr ( implode ( ',' Array )) All elements in the array mast be integer
@ -140,17 +181,21 @@ class SqlCriteria
/**
* @ param string | array $fields
* @ param bool $convert_to_db_expression
* @ ex SqlCriteria :: select ( 'field' )
* @ ex SqlCriteria -> select ( array ( 'field1' , 'field2' ))
* @ ex SqlCriteria -> select ( 'field1,field2' )
* @ return SqlCriteria
*/
public function select ( $fields )
public function select ( $fields , $convert_to_db_expression = false )
{
if ( ! is_array ( $fields )) {
$fields = explode ( ',' , $fields );
}
$fields = array_map ( function ( $item ){ return trim ( $item );}, $fields );
if ( $convert_to_db_expression ) {
$fields = array_map ( function ( $item ){ return new DbExpr ( $item );}, $fields );
}
$this -> select = array_merge ( $this -> select , $fields );
return $this ;
}