Version 3 #1

Manually merged
timw4mail merged 47 commits from develop into master 2020-04-23 18:39:27 -04:00
7 changed files with 107 additions and 27 deletions
Showing only changes of commit 4201a7c42c - Show all commits

View File

@ -15,11 +15,13 @@
*/ */
namespace Query\Drivers; namespace Query\Drivers;
use function dbFilter;
use InvalidArgumentException; use InvalidArgumentException;
use PDO; use PDO;
use PDOStatement; use PDOStatement;
use function call_user_func_array;
use function dbFilter;
use function is_object;
use function is_string; use function is_string;
/** /**
@ -127,11 +129,11 @@ abstract class AbstractDriver
{ {
if ( if (
isset($this->$name) isset($this->$name)
&& \is_object($this->$name) && is_object($this->$name)
&& method_exists($this->$name, '__invoke') && method_exists($this->$name, '__invoke')
) )
{ {
return \call_user_func_array([$this->$name, '__invoke'], $args); return call_user_func_array([$this->$name, '__invoke'], $args);
} }
return NULL; return NULL;
@ -287,7 +289,7 @@ abstract class AbstractDriver
* @param string $table * @param string $table
* @return string * @return string
*/ */
public function quoteTable($table): string public function quoteTable(string $table): string
{ {
$table = $this->prefixTable($table); $table = $this->prefixTable($table);
@ -333,7 +335,7 @@ abstract class AbstractDriver
{ {
// Unquote the function // Unquote the function
// Quote the inside identifiers // Quote the inside identifiers
$raw = str_replace(array($f[0], $f[3]), array($f[1], $this->quoteIdent($f[3])), $raw); $raw = str_replace([$f[0], $f[3]], [$f[1], $this->quoteIdent($f[3])], $raw);
} }
return $raw; return $raw;

View File

@ -165,10 +165,10 @@ interface DriverInterface /* extends the interface of PDO */ {
/** /**
* Quote database table name, and set prefix * Quote database table name, and set prefix
* *
* @param string|array $table * @param string $table
* @return string|array * @return string
*/ */
public function quoteTable($table); public function quoteTable(string $table): string;
/** /**
* Create and execute a prepared statement with the provided parameters * Create and execute a prepared statement with the provided parameters

27
src/JoinType.php Normal file
View File

@ -0,0 +1,27 @@
<?php declare(strict_types=1);
/**
* Query
*
* SQL Query Builder / Database Abstraction Layer
*
* PHP version 7.4
*
* @package Query
* @author Timothy J. Warren <tim@timshomepage.net>
* @copyright 2012 - 2020 Timothy J. Warren
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @link https://git.timshomepage.net/aviat/Query
* @version 3.0.0
*/
namespace Query;
/**
* 'Enum' of join types
*/
class JoinType {
public const CROSS = 'cross';
public const INNER = 'inner';
public const OUTER = 'outer';
public const LEFT = 'left';
public const RIGHT = 'right';
}

25
src/LikeType.php Normal file
View File

@ -0,0 +1,25 @@
<?php declare(strict_types=1);
/**
* Query
*
* SQL Query Builder / Database Abstraction Layer
*
* PHP version 7.4
*
* @package Query
* @author Timothy J. Warren <tim@timshomepage.net>
* @copyright 2012 - 2020 Timothy J. Warren
* @license http://www.opensource.org/licenses/mit-license.html MIT License
* @link https://git.timshomepage.net/aviat/Query
* @version 3.0.0
*/
namespace Query;
/**
* 'Enum' of join types
*/
class LikeType {
public const BEFORE = 'before';
public const AFTER = 'after';
public const BOTH = 'both';
}

View File

@ -17,6 +17,7 @@ namespace Query;
use function is_array; use function is_array;
use function is_int; use function is_int;
use function mb_trim;
use PDOStatement; use PDOStatement;
@ -170,14 +171,27 @@ class QueryBuilder extends QueryBuilderBase implements QueryBuilderInterface {
/** /**
* Specify the database table to select from * Specify the database table to select from
* *
* @param string $tblname * Alias of `from` method to better match CodeIgniter 4
*
* @param string $tableName
* @return self * @return self
*/ */
public function from(string $tblname): self public function table(string $tableName): self
{
return $this->from($tableName);
}
/**
* Specify the database table to select from
*
* @param string $tableName
* @return self
*/
public function from(string $tableName): self
{ {
// Split identifiers on spaces // Split identifiers on spaces
$identArray = explode(' ', \mb_trim($tblname)); $identArray = explode(' ', mb_trim($tableName));
$identArray = array_map('\\mb_trim', $identArray); $identArray = array_map('mb_trim', $identArray);
// Quote the identifiers // Quote the identifiers
$identArray[0] = $this->driver->quoteTable($identArray[0]); $identArray[0] = $this->driver->quoteTable($identArray[0]);
@ -201,7 +215,7 @@ class QueryBuilder extends QueryBuilderBase implements QueryBuilderInterface {
* @param string $pos * @param string $pos
* @return self * @return self
*/ */
public function like(string $field, $val, string $pos='both'): self public function like(string $field, $val, string $pos=LikeType::BOTH): self
{ {
return $this->_like($field, $val, $pos); return $this->_like($field, $val, $pos);
} }
@ -214,7 +228,7 @@ class QueryBuilder extends QueryBuilderBase implements QueryBuilderInterface {
* @param string $pos * @param string $pos
* @return self * @return self
*/ */
public function orLike(string $field, $val, string $pos='both'): self public function orLike(string $field, $val, string $pos=LikeType::BOTH): self
{ {
return $this->_like($field, $val, $pos, 'LIKE', 'OR'); return $this->_like($field, $val, $pos, 'LIKE', 'OR');
} }
@ -227,7 +241,7 @@ class QueryBuilder extends QueryBuilderBase implements QueryBuilderInterface {
* @param string $pos * @param string $pos
* @return self * @return self
*/ */
public function notLike(string $field, $val, string $pos='both'): self public function notLike(string $field, $val, string $pos=LikeType::BOTH): self
{ {
return $this->_like($field, $val, $pos, 'NOT LIKE'); return $this->_like($field, $val, $pos, 'NOT LIKE');
} }
@ -240,7 +254,7 @@ class QueryBuilder extends QueryBuilderBase implements QueryBuilderInterface {
* @param string $pos * @param string $pos
* @return self * @return self
*/ */
public function orNotLike(string $field, $val, string $pos='both'): self public function orNotLike(string $field, $val, string $pos=LikeType::BOTH): self
{ {
return $this->_like($field, $val, $pos, 'NOT LIKE', 'OR'); return $this->_like($field, $val, $pos, 'NOT LIKE', 'OR');
} }

View File

@ -226,13 +226,15 @@ class QueryBuilderBase {
// Add the like string into the order map // Add the like string into the order map
$like = $field . " {$like} ?"; $like = $field . " {$like} ?";
if ($pos === 'before') if ($pos === LikeType::BEFORE)
{ {
$val = "%{$val}"; $val = "%{$val}";
} elseif ($pos === 'after') }
elseif ($pos === LikeType::AFTER)
{ {
$val = "{$val}%"; $val = "{$val}%";
} else }
else
{ {
$val = "%{$val}%"; $val = "%{$val}%";
} }

View File

@ -124,10 +124,20 @@ interface QueryBuilderInterface {
/** /**
* Specify the database table to select from * Specify the database table to select from
* *
* @param string $tblname * Alias of `from` method to better match CodeIgniter 4
*
* @param string $tableName
* @return self * @return self
*/ */
public function from(string $tblname): self; public function table(string $tableName): self;
/**
* Specify the database table to select from
*
* @param string $tableName
* @return self
*/
public function from(string $tableName): self;
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// ! 'Like' methods // ! 'Like' methods
@ -141,7 +151,7 @@ interface QueryBuilderInterface {
* @param string $pos * @param string $pos
* @return self * @return self
*/ */
public function like(string $field, $values, string $pos='both'): self; public function like(string $field, $values, string $pos=LikeType::BOTH): self;
/** /**
* Generates an OR Like clause * Generates an OR Like clause
@ -151,7 +161,7 @@ interface QueryBuilderInterface {
* @param string $pos * @param string $pos
* @return self * @return self
*/ */
public function orLike(string $field, $values, string $pos='both'): self; public function orLike(string $field, $values, string $pos=LikeType::BOTH): self;
/** /**
* Generates a NOT LIKE clause * Generates a NOT LIKE clause
@ -161,7 +171,7 @@ interface QueryBuilderInterface {
* @param string $pos * @param string $pos
* @return self * @return self
*/ */
public function notLike(string $field, $values, string $pos='both'): self; public function notLike(string $field, $values, string $pos=LikeType::BOTH): self;
/** /**
* Generates a OR NOT LIKE clause * Generates a OR NOT LIKE clause
@ -171,7 +181,7 @@ interface QueryBuilderInterface {
* @param string $pos * @param string $pos
* @return self * @return self
*/ */
public function orNotLike(string $field, $values, string $pos='both'): self; public function orNotLike(string $field, $values, string $pos=LikeType::BOTH): self;
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// ! Having methods // ! Having methods
@ -277,7 +287,7 @@ interface QueryBuilderInterface {
* @param string $type * @param string $type
* @return self * @return self
*/ */
public function join(string $table, string $condition, string $type=''): self; public function join(string $table, string $condition, string $type=JoinType::INNER): self;
/** /**
* Group the results by the selected field(s) * Group the results by the selected field(s)