Fix some issues with multiple array items in where statements
This commit is contained in:
parent
e0bc5ce903
commit
275cb30ee1
2
.gitignore
vendored
2
.gitignore
vendored
@ -8,3 +8,5 @@ coverage/*
|
|||||||
vendor/*
|
vendor/*
|
||||||
composer.lock
|
composer.lock
|
||||||
docs/phpdoc*
|
docs/phpdoc*
|
||||||
|
.project
|
||||||
|
all_tests
|
@ -361,7 +361,7 @@ abstract class Abstract_Query_Builder {
|
|||||||
* @param string $conj
|
* @param string $conj
|
||||||
* @return Query_Builder
|
* @return Query_Builder
|
||||||
*/
|
*/
|
||||||
protected function _where_string($key, $val=array(), $conj='AND')
|
protected function _where_string($key, $val=array(), $defaultConj='AND')
|
||||||
{
|
{
|
||||||
// Create key/value placeholders
|
// Create key/value placeholders
|
||||||
foreach($this->_where($key, $val) as $f => $val)
|
foreach($this->_where($key, $val) as $f => $val)
|
||||||
@ -374,13 +374,11 @@ abstract class Abstract_Query_Builder {
|
|||||||
|
|
||||||
// Simple key value, or an operator
|
// Simple key value, or an operator
|
||||||
$item .= (count($f_array) === 1) ? '=?' : " {$f_array[1]} ?";
|
$item .= (count($f_array) === 1) ? '=?' : " {$f_array[1]} ?";
|
||||||
|
|
||||||
// Get the type of the first item in the query map
|
|
||||||
$first_item = current($this->query_map);
|
|
||||||
$last_item = end($this->query_map);
|
$last_item = end($this->query_map);
|
||||||
|
|
||||||
// Determine the correct conjunction
|
// Determine the correct conjunction
|
||||||
if (empty($this->query_map) || stripos($first_item['conjunction'], 'JOIN') !== FALSE)
|
$conjunctionList = array_pluck($this->query_map, 'conjunction');
|
||||||
|
if (empty($this->query_map) || ( ! regex_in_array($conjunctionList, "/^ ?\n?WHERE/i")))
|
||||||
{
|
{
|
||||||
$conj = "\nWHERE ";
|
$conj = "\nWHERE ";
|
||||||
}
|
}
|
||||||
@ -390,7 +388,7 @@ abstract class Abstract_Query_Builder {
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$conj = " {$conj} ";
|
$conj = " {$defaultConj} ";
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->_append_map($conj, $item, 'where');
|
$this->_append_map($conj, $item, 'where');
|
||||||
|
@ -164,13 +164,13 @@ class Query_Builder extends Abstract_Query_Builder implements Query_Builder_Inte
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Alias to driver util class
|
* Alias to driver util class
|
||||||
* @var \Query\Driver\Abstract_Util
|
* @var \Query\Driver\Util\Abstract_Util
|
||||||
*/
|
*/
|
||||||
public $util;
|
public $util;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Alias to driver sql class
|
* Alias to driver sql class
|
||||||
* @var \Query\Driver\SQL_Interface
|
* @var \Query\Driver\SQL\SQL_Interface
|
||||||
*/
|
*/
|
||||||
public $sql;
|
public $sql;
|
||||||
|
|
||||||
|
53
common.php
53
common.php
@ -123,6 +123,59 @@ function array_zipper(Array $zipper_input)
|
|||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an array out of an multi-dimensional array based on a common
|
||||||
|
* key
|
||||||
|
*
|
||||||
|
* @param array $array
|
||||||
|
* @param string $key
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function array_pluck(Array $array, $key)
|
||||||
|
{
|
||||||
|
$output = array();
|
||||||
|
|
||||||
|
// No point iterating over an empty array
|
||||||
|
if (empty($array)) return $array;
|
||||||
|
|
||||||
|
foreach($array as $inner_array)
|
||||||
|
{
|
||||||
|
if (array_key_exists($key, $inner_array))
|
||||||
|
{
|
||||||
|
$output[] = $inner_array[$key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $output;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether a value in the passed array matches the pattern
|
||||||
|
* passed
|
||||||
|
*
|
||||||
|
* @param array $array
|
||||||
|
* @param string $pattern
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function regex_in_array(Array $array, $pattern)
|
||||||
|
{
|
||||||
|
if (empty($array)) return FALSE;
|
||||||
|
|
||||||
|
foreach($array as $item)
|
||||||
|
{
|
||||||
|
if (is_scalar($item))
|
||||||
|
{
|
||||||
|
if (preg_match($pattern, $item)) return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connection function
|
* Connection function
|
||||||
*
|
*
|
||||||
|
@ -11,8 +11,6 @@ test:
|
|||||||
php_unit:
|
php_unit:
|
||||||
config: 'tests/phpunit.xml'
|
config: 'tests/phpunit.xml'
|
||||||
run_from: 'tests'
|
run_from: 'tests'
|
||||||
#args: ' --debug '
|
|
||||||
coverage: '../coverage/'
|
|
||||||
php_docblock_checker:
|
php_docblock_checker:
|
||||||
allowed_warnings: 0
|
allowed_warnings: 0
|
||||||
skip_classes: true
|
skip_classes: true
|
||||||
|
@ -167,6 +167,71 @@ abstract class QBTest extends Query_TestCase {
|
|||||||
$this->assertIsA($query, 'PDOStatement');
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public function testSelectAvg()
|
||||||
|
{
|
||||||
|
$query = $this->db->select_avg('id', 'di')
|
||||||
|
->get('test');
|
||||||
|
|
||||||
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public function testSelectSum()
|
||||||
|
{
|
||||||
|
$query = $this->db->select_sum('id', 'di')
|
||||||
|
->get('test');
|
||||||
|
|
||||||
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public function testSelectDistinct()
|
||||||
|
{
|
||||||
|
$query = $this->db->select_sum('id', 'di')
|
||||||
|
->distinct()
|
||||||
|
->get('test');
|
||||||
|
|
||||||
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public function testSelectGet()
|
||||||
|
{
|
||||||
|
$query = $this->db->select('id, key as k, val')
|
||||||
|
->get('test', 2, 1);
|
||||||
|
|
||||||
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public function testSelectFromGet()
|
||||||
|
{
|
||||||
|
$query = $this->db->select('id, key as k, val')
|
||||||
|
->from('test ct')
|
||||||
|
->where('id >', 1)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public function testSelectFromLimitGet()
|
||||||
|
{
|
||||||
|
$query = $this->db->select('id, key as k, val')
|
||||||
|
->from('test ct')
|
||||||
|
->where('id >', 1)
|
||||||
|
->limit(3)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
@ -335,72 +400,6 @@ abstract class QBTest extends Query_TestCase {
|
|||||||
$this->assertIsA($query, 'PDOStatement');
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
public function testSelectAvg()
|
|
||||||
{
|
|
||||||
$query = $this->db->select_avg('id', 'di')
|
|
||||||
->get('test');
|
|
||||||
|
|
||||||
$this->assertIsA($query, 'PDOStatement');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
public function testSelectSum()
|
|
||||||
{
|
|
||||||
$query = $this->db->select_sum('id', 'di')
|
|
||||||
->get('test');
|
|
||||||
|
|
||||||
$this->assertIsA($query, 'PDOStatement');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
public function testSelectDistinct()
|
|
||||||
{
|
|
||||||
$query = $this->db->select_sum('id', 'di')
|
|
||||||
->distinct()
|
|
||||||
->get('test');
|
|
||||||
|
|
||||||
$this->assertIsA($query, 'PDOStatement');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
public function testSelectGet()
|
|
||||||
{
|
|
||||||
$query = $this->db->select('id, key as k, val')
|
|
||||||
->get('test', 2, 1);
|
|
||||||
|
|
||||||
$this->assertIsA($query, 'PDOStatement');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
public function testSelectFromGet()
|
|
||||||
{
|
|
||||||
$query = $this->db->select('id, key as k, val')
|
|
||||||
->from('test ct')
|
|
||||||
->where('id >', 1)
|
|
||||||
->get();
|
|
||||||
|
|
||||||
$this->assertIsA($query, 'PDOStatement');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
|
||||||
|
|
||||||
public function testSelectFromLimitGet()
|
|
||||||
{
|
|
||||||
$query = $this->db->select('id, key as k, val')
|
|
||||||
->from('test ct')
|
|
||||||
->where('id >', 1)
|
|
||||||
->limit(3)
|
|
||||||
->get();
|
|
||||||
|
|
||||||
$this->assertIsA($query, 'PDOStatement');
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// ! Query modifier tests
|
// ! Query modifier tests
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
@ -572,6 +571,21 @@ abstract class QBTest extends Query_TestCase {
|
|||||||
$this->assertIsA($query, 'PDOStatement');
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public function testJoinWithMultipleWhereValues()
|
||||||
|
{
|
||||||
|
$query = $this->db->from('test ct')
|
||||||
|
->join('join cj', 'cj.id=ct.id', 'inner')
|
||||||
|
->where(array(
|
||||||
|
'ct.id < ' => 3,
|
||||||
|
'ct.key' => 'foo'
|
||||||
|
))
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// ! DB update tests
|
// ! DB update tests
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
@ -680,6 +694,18 @@ abstract class QBTest extends Query_TestCase {
|
|||||||
$this->assertIsA($query, 'PDOStatement');
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public function testDeleteWithMultipleWhereValues()
|
||||||
|
{
|
||||||
|
$query = $this->db->delete('test', array(
|
||||||
|
'id' => 5,
|
||||||
|
'key' => 'gogle'
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertIsA($query, 'PDOStatement');
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// ! Non-data read queries
|
// ! Non-data read queries
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user