Skip to content

Commit ecbf0cf

Browse files
committed
- Select-Statements: WHERE and HAVING clauses can now be called alternatively to arrays with an object as expression parameter.
- Select-Statements: WHERE and HAVING clauses can now be called with an empty array or an empty object. As a result, no HAVING or WHERE is generated. Previously, an empty WHERE or HAVING was output. - Various minor changes
1 parent 80645fe commit ecbf0cf

File tree

9 files changed

+187
-105
lines changed

9 files changed

+187
-105
lines changed

composer.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
22
"name": "rkr/php-mysql-query-builder",
3-
"description": "Easy to use query builder for PHP5.3+/PDO",
3+
"description": "Easy to use query builder for PHP7.0+/PDO",
44
"license": "MIT",
5+
"type": "library",
56
"authors": [{
67
"name": "ron",
78
"email": "[email protected]"
@@ -32,5 +33,10 @@
3233
"scripts": {
3334
"phpstan": "phpstan analyse --level 4 src",
3435
"phpunit": "phpunit -c tests.xml"
36+
},
37+
"config": {
38+
"platform": {
39+
"php": "7.0.32"
40+
}
3541
}
3642
}

src/Builder/Traits/HavingBuilder.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ public function having($expression, ...$args) {
2020
if($expression->isValid()) {
2121
$this->having[] = [$expression->getExpression(), $expression->getValue()];
2222
}
23+
} elseif(is_array($expression) || is_object($expression)) {
24+
if(is_object($expression)) {
25+
$expression = (array) $expression;
26+
}
27+
if(count($expression) > 0) {
28+
$this->having[] = [$expression, array_slice(func_get_args(), 1)];
29+
}
2330
} else {
2431
$this->having[] = [$expression, array_slice(func_get_args(), 1)];
2532
}

src/Builder/Traits/JoinBuilder.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ trait JoinBuilder {
1010

1111
/**
1212
* @param string $alias
13-
* @param string $table
13+
* @param string|array[] $table
1414
* @param string $expression
1515
* @param array<int, mixed> $args
1616
* @return $this
@@ -21,7 +21,7 @@ public function joinInner($alias, $table, $expression = null, ...$args) {
2121

2222
/**
2323
* @param string $alias
24-
* @param string $table
24+
* @param string|array[] $table
2525
* @param string $expression
2626
* @param array<int, mixed> $args
2727
* @return $this
@@ -32,7 +32,7 @@ public function joinLeft($alias, $table, $expression, ...$args) {
3232

3333
/**
3434
* @param string $alias
35-
* @param string $table
35+
* @param string|array[] $table
3636
* @param string $expression
3737
* @param array<int, mixed> $args
3838
* @return $this
@@ -64,12 +64,12 @@ protected function buildJoins($query) {
6464
/**
6565
* @param string $type
6666
* @param string $alias
67-
* @param string $name
67+
* @param string|array[] $name
6868
* @param string $expression
6969
* @param array<int, mixed> $arguments
7070
* @return $this
7171
*/
72-
private function addJoin($type, $alias, $name, $expression = null, array $arguments = []) {
72+
private function addJoin(string $type, $alias, $name, $expression = null, array $arguments = []) {
7373
$this->joinTables[] = [
7474
'type' => $type,
7575
'alias' => $alias,

src/Builder/Traits/WhereBuilder.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ trait WhereBuilder {
1010

1111
/** @var array<int, mixed> */
1212
private $where = [];
13-
13+
1414
/**
1515
* @param string|array|OptionalExpression $expression
1616
* @param array<int, mixed> $args
@@ -21,6 +21,13 @@ public function where($expression, ...$args) {
2121
if($expression->isValid()) {
2222
$this->where[] = [$expression->getExpression(), $expression->getValue()];
2323
}
24+
} elseif(is_array($expression) || is_object($expression)) {
25+
if(is_object($expression)) {
26+
$expression = (array) $expression;
27+
}
28+
if(count($expression) > 0) {
29+
$this->where[] = [$expression, $args];
30+
}
2431
} else {
2532
$this->where[] = [$expression, $args];
2633
}

tests/Builder/DeleteTest.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public function testAlias() {
99
->from('t', 'travis#test1')
1010
->where('t.a = 1')
1111
->asString();
12-
$this->assertEquals("DELETE t FROM\n\ttravis_test.test1 t\nWHERE\n\t(t.a = 1)\n", $query);
12+
self::assertEquals("DELETE t FROM\n\ttravis_test.test1 t\nWHERE\n\t(t.a = 1)\n", $query);
1313
}
1414

1515
public function testMultipleTables() {
@@ -18,15 +18,15 @@ public function testMultipleTables() {
1818
->from('t2', 'travis#test2')
1919
->where('t1.a = 1')
2020
->asString();
21-
$this->assertEquals("DELETE t1, t2 FROM\n\ttravis_test.test1 t1,\n\ttravis_test.test2 t2\nWHERE\n\t(t1.a = 1)\n", $sql);
21+
self::assertEquals("DELETE t1, t2 FROM\n\ttravis_test.test1 t1,\n\ttravis_test.test2 t2\nWHERE\n\t(t1.a = 1)\n", $sql);
2222
}
2323

2424
public function testJoins() {
2525
$sql = TestDelete::create()
2626
->from('t1', 'travis#test1')
2727
->joinInner('t2', 'travis#test2', 't1.id = t2.id')
2828
->asString();
29-
$this->assertEquals("DELETE t1 FROM\n\ttravis_test.test1 t1\nINNER JOIN\n\ttravis_test.test2 t2 ON t1.id = t2.id\n", $sql);
29+
self::assertEquals("DELETE t1 FROM\n\ttravis_test.test1 t1\nINNER JOIN\n\ttravis_test.test2 t2 ON t1.id = t2.id\n", $sql);
3030
}
3131

3232
public function testWhere() {
@@ -35,46 +35,46 @@ public function testWhere() {
3535
->where('field1=?', 1)
3636
->where('field2 != field1')
3737
->asString();
38-
$this->assertEquals("DELETE FROM\n\ttravis_test.test1\nWHERE\n\t(field1='1')\n\tAND\n\t(field2 != field1)\n", $sql);
38+
self::assertEquals("DELETE FROM\n\ttravis_test.test1\nWHERE\n\t(field1='1')\n\tAND\n\t(field2 != field1)\n", $sql);
3939
}
4040

4141
public function testWhereViaArray() {
4242
$sql = TestDelete::create()
4343
->from('travis#test1')
4444
->where(['field1' => 1, 'field2' => 'aaa'])
4545
->asString();
46-
$this->assertEquals("DELETE FROM\n\ttravis_test.test1\nWHERE\n\t(`field1`='1')\n\tAND\n\t(`field2`='aaa')\n", $sql);
46+
self::assertEquals("DELETE FROM\n\ttravis_test.test1\nWHERE\n\t(`field1`='1')\n\tAND\n\t(`field2`='aaa')\n", $sql);
4747
}
4848

4949
public function testDBExpr() {
5050
$sql = TestDelete::create()
5151
->from('travis#test1')
5252
->where('field1=?', new DBExpr('NOW()'))
5353
->asString();
54-
$this->assertEquals("DELETE FROM\n\ttravis_test.test1\nWHERE\n\t(field1=NOW())\n", $sql);
54+
self::assertEquals("DELETE FROM\n\ttravis_test.test1\nWHERE\n\t(field1=NOW())\n", $sql);
5555
}
5656

5757
public function testOrderBy() {
5858
$sql = TestDelete::create()
5959
->from('travis#test1')
6060
->orderBy('field1', 'DESC')
6161
->asString();
62-
$this->assertEquals("DELETE FROM\n\ttravis_test.test1\nORDER BY\n\tfield1 DESC\n", $sql);
62+
self::assertEquals("DELETE FROM\n\ttravis_test.test1\nORDER BY\n\tfield1 DESC\n", $sql);
6363
}
6464

6565
public function testLimit() {
6666
$sql = TestDelete::create()
6767
->from('travis#test1')
6868
->limit(10)
6969
->asString();
70-
$this->assertEquals("DELETE FROM\n\ttravis_test.test1\nLIMIT\n\t10\n", $sql);
70+
self::assertEquals("DELETE FROM\n\ttravis_test.test1\nLIMIT\n\t10\n", $sql);
7171
}
7272

7373
public function testOffset() {
7474
$sql = TestDelete::create()
7575
->from('travis#test1')
7676
->offset(10)
7777
->asString();
78-
$this->assertEquals("DELETE FROM\n\ttravis_test.test1\nOFFSET\n\t10\n", $sql);
78+
self::assertEquals("DELETE FROM\n\ttravis_test.test1\nOFFSET\n\t10\n", $sql);
7979
}
8080
}

tests/Builder/InsertTest.php

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
use Kir\MySQL\Builder\InsertTest\TestInsert;
55
use Kir\MySQL\Builder\SelectTest\TestSelect;
6+
use Kir\MySQL\Databases\MySQL;
7+
use Kir\MySQL\Tools\AliasRegistry;
68
use Phake;
79

810
class InsertTest extends \PHPUnit_Framework_TestCase {
@@ -11,15 +13,15 @@ public function testAlias() {
1113
->into('travis#test1')
1214
->addExpr('last_update=NOW()')
1315
->asString();
14-
$this->assertEquals("INSERT INTO\n\ttravis_test.test1\nSET\n\tlast_update=NOW()\n", $query);
16+
self::assertEquals("INSERT INTO\n\ttravis_test.test1\nSET\n\tlast_update=NOW()\n", $query);
1517
}
1618

1719
public function testAddExpr() {
1820
$query = TestInsert::create()
1921
->into('test1')
2022
->addExpr('last_update=NOW()')
2123
->asString();
22-
$this->assertEquals("INSERT INTO\n\ttest1\nSET\n\tlast_update=NOW()\n", $query);
24+
self::assertEquals("INSERT INTO\n\ttest1\nSET\n\tlast_update=NOW()\n", $query);
2325
}
2426

2527
public function testMassInsert() {
@@ -34,14 +36,14 @@ public function testMassInsert() {
3436
->updateExpr('a = VALUES(a)')
3537
->asString();
3638

37-
$this->assertEquals("INSERT INTO\n\ttravis_test.test2\n\t(a)\nSELECT\n\tb AS `a`\nFROM\n\ttravis_test.test1 oi\nWHERE\n\t(1!=2)\nON DUPLICATE KEY UPDATE\n\ta = VALUES(a)\n", $query);
39+
self::assertEquals("INSERT INTO\n\ttravis_test.test2\n\t(a)\nSELECT\n\tb AS `a`\nFROM\n\ttravis_test.test1 oi\nWHERE\n\t(1!=2)\nON DUPLICATE KEY UPDATE\n\ta = VALUES(a)\n", $query);
3840
}
3941

4042
public function testAddAll() {
41-
$reg = Phake::mock('Kir\\MySQL\\Tools\\AliasRegistry');
43+
$reg = Phake::mock(AliasRegistry::class);
4244
Phake::when($reg)->__call('get', ['travis'])->thenReturn('travis_test.');
4345

44-
$db = Phake::mock('Kir\\MySQL\\Databases\\MySQL');
46+
$db = Phake::mock(MySQL::class);
4547
Phake::when($db)->__call('getTableFields', ['test1'])->thenReturn(['field1', 'field2']);
4648
Phake::when($db)->__call('getTableFields', ['travis_test.test1'])->thenReturn(['field1', 'field2']);
4749
Phake::when($db)->__call('quoteField', [Phake::anyParameters()])->thenGetReturnByLambda(function ($fieldName) { return "`{$fieldName}`"; });
@@ -52,19 +54,19 @@ public function testAddAll() {
5254
->into('test1')
5355
->addAll(['field1' => 123, 'field2' => 456])
5456
->asString();
55-
$this->assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123',\n\t`field2`='456'\n", $query);
57+
self::assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123',\n\t`field2`='456'\n", $query);
5658

5759
$query = (new TestInsert($db))
5860
->into('test1')
5961
->addAll(['field1' => 123, 'field2' => 456], ['field1'])
6062
->asString();
61-
$this->assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123'\n", $query);
63+
self::assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123'\n", $query);
6264

6365
$query = (new TestInsert($db))
6466
->into('travis#test1')
6567
->addAll(['field1' => 123, 'field2' => 456], ['field1'])
6668
->asString();
67-
$this->assertEquals("INSERT INTO\n\ttravis_test.test1\nSET\n\t`field1`='123'\n", $query);
69+
self::assertEquals("INSERT INTO\n\ttravis_test.test1\nSET\n\t`field1`='123'\n", $query);
6870
}
6971

7072
public function testUpdateAll() {
@@ -83,28 +85,28 @@ public function testUpdateAll() {
8385
->add('field1', 123)
8486
->updateAll(['field1' => 123, 'field2' => 456])
8587
->asString();
86-
$this->assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123',\n\t`field2`='456'\n", $query);
88+
self::assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123',\n\t`field2`='456'\n", $query);
8789

8890
$query = (new TestInsert($db))
8991
->into('test1')
9092
->add('field1', 123)
9193
->updateAll(['field1' => 123, 'field2' => 456], ['field1'])
9294
->asString();
93-
$this->assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123'\n", $query);
95+
self::assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123'\n", $query);
9496

9597
$query = (new TestInsert($db))
9698
->into('travis#test1')
9799
->add('field1', 123)
98100
->updateAll(['field1' => 123, 'field2' => 456], ['field1'])
99101
->asString();
100-
$this->assertEquals("INSERT INTO\n\ttravis_test.test1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123'\n", $query);
102+
self::assertEquals("INSERT INTO\n\ttravis_test.test1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123'\n", $query);
101103
}
102104

103105
public function testAddOrUpdateAll() {
104-
$reg = Phake::mock('Kir\\MySQL\\Tools\\AliasRegistry');
106+
$reg = Phake::mock(AliasRegistry::class);
105107
Phake::when($reg)->__call('get', ['travis'])->thenReturn('travis_test.');
106108

107-
$db = Phake::mock('Kir\\MySQL\\Databases\\MySQL');
109+
$db = Phake::mock(MySQL::class);
108110
Phake::when($db)->__call('getTableFields', ['test1'])->thenReturn(['field1', 'field2']);
109111
Phake::when($db)->__call('getTableFields', ['travis_test.test1'])->thenReturn(['field1', 'field2']);
110112
Phake::when($db)->__call('quoteField', [Phake::anyParameters()])->thenGetReturnByLambda(function ($fieldName) { return "`{$fieldName}`"; });
@@ -115,19 +117,19 @@ public function testAddOrUpdateAll() {
115117
->into('test1')
116118
->addOrUpdateAll(['field1' => 123, 'field2' => 456])
117119
->asString();
118-
$this->assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123',\n\t`field2`='456'\nON DUPLICATE KEY UPDATE\n\t`field1`='123',\n\t`field2`='456'\n", $query);
120+
self::assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123',\n\t`field2`='456'\nON DUPLICATE KEY UPDATE\n\t`field1`='123',\n\t`field2`='456'\n", $query);
119121

120122
$query = (new TestInsert($db))
121123
->into('test1')
122124
->addOrUpdateAll(['field1' => 123, 'field2' => 456], ['field1'])
123125
->asString();
124-
$this->assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123'\n", $query);
126+
self::assertEquals("INSERT INTO\n\ttest1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123'\n", $query);
125127

126128
$query = (new TestInsert($db))
127129
->into('travis#test1')
128130
->addOrUpdateAll(['field1' => 123, 'field2' => 456], ['field1'])
129131
->asString();
130-
$this->assertEquals("INSERT INTO\n\ttravis_test.test1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123'\n", $query);
132+
self::assertEquals("INSERT INTO\n\ttravis_test.test1\nSET\n\t`field1`='123'\nON DUPLICATE KEY UPDATE\n\t`field1`='123'\n", $query);
131133
}
132134

133135
public function testMask() {
@@ -137,7 +139,7 @@ public function testMask() {
137139
->addOrUpdate('field2', 2)
138140
->setMask(['field1'])
139141
->asString();
140-
$this->assertEquals("INSERT INTO\n\ttest\nSET\n\t`field1`='1'\nON DUPLICATE KEY UPDATE\n\t`field1`='1'\n", $sql);
142+
self::assertEquals("INSERT INTO\n\ttest\nSET\n\t`field1`='1'\nON DUPLICATE KEY UPDATE\n\t`field1`='1'\n", $sql);
141143
}
142144

143145
public function testExprWithParams() {
@@ -147,7 +149,7 @@ public function testExprWithParams() {
147149
->updateExpr('b=?', 'b')
148150
->addOrUpdateExpr('c=?', 'c')
149151
->asString();
150-
$this->assertEquals("INSERT INTO\n\ttest\nSET\n\ta='a',\n\tc='c'\nON DUPLICATE KEY UPDATE\n\tb='b',\n\tc='c'\n", $sql);
152+
self::assertEquals("INSERT INTO\n\ttest\nSET\n\ta='a',\n\tc='c'\nON DUPLICATE KEY UPDATE\n\tb='b',\n\tc='c'\n", $sql);
151153
}
152154

153155
public function testDBExpr() {
@@ -157,6 +159,6 @@ public function testDBExpr() {
157159
->updateExpr('b=?', new DBExpr('NOW()'))
158160
->addOrUpdateExpr('c=?', new DBExpr('NOW()'))
159161
->asString();
160-
$this->assertEquals("INSERT INTO\n\ttest\nSET\n\ta=NOW(),\n\tc=NOW()\nON DUPLICATE KEY UPDATE\n\tb=NOW(),\n\tc=NOW()\n", $sql);
162+
self::assertEquals("INSERT INTO\n\ttest\nSET\n\ta=NOW(),\n\tc=NOW()\nON DUPLICATE KEY UPDATE\n\tb=NOW(),\n\tc=NOW()\n", $sql);
161163
}
162164
}

tests/Builder/InsertTest/TestInsert.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ class TestInsert extends Insert {
99
* @return static
1010
*/
1111
public static function create() {
12-
$functions = array(
12+
$functions = [
1313
'getTableFields' => function ($tableName) {
14-
return array(
14+
return [
1515
'id',
1616
'name',
1717
'last_update'
18-
);
18+
];
1919
}
20-
);
20+
];
2121
$db = new TestDB($functions);
2222
return new static($db);
2323
}
@@ -28,4 +28,4 @@ public static function create() {
2828
public function asString() {
2929
return $this->__toString();
3030
}
31-
}
31+
}

0 commit comments

Comments
 (0)