Skip to content

Commit fecec16

Browse files
committed
#17 - Fix Order to behave compatible (sql() method added)
1 parent f889fce commit fecec16

File tree

4 files changed

+69
-33
lines changed

4 files changed

+69
-33
lines changed

README.md

+57-18
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ $arr = $db->queryList('SELECT * FROM #__devtest', 'MyNamespace\\MyDataClass');
7171
$obj = $db->querySingle('SELECT * FROM #__devtest WHERE uid='.$uid, 'MyNamespace\\MyDataClass');
7272
```
7373

74-
## Inserting, Updating and deleting objects
74+
## Inserting, Updating and Deleting objects
7575

7676
You can insert your own data classes or simply use `stdClass` objects or arrays:
7777

@@ -172,7 +172,7 @@ $users = $dao->find(array('group' => 'admin', 'active' => 1), array('name', 'ema
172172
**Attention:** This way of describing restrictions is deprecated as of v1.3. `find()` and `findSingle()` now support
173173
the new Query API. Please read the [QueryAPI](#Query API) chapter.
174174

175-
## Creating, saving and deleting objects
175+
## Creating, Saving and Deleting objects
176176

177177
```
178178
// Create a new user
@@ -452,6 +452,57 @@ And it is possible to combine restrictions with `and()` and `or()`:
452452
$expr = Restrictions::or($expr1, $expr2, $expr3);
453453
```
454454

455+
## Sorting the result
456+
The `Order` class contains three static methods that produce according clauses:
457+
458+
```
459+
// Ascending order
460+
$order1 = \TgDatabase\Order::asc('columnName1');
461+
462+
// Descending order
463+
$order2 = \TgDatabase\Order::desc('columnName2');
464+
465+
// Use plain SQL as given in argument
466+
$order3 = \TgDatabase\Order::sql('ANY_SQL_FUNCTION() ASC');
467+
468+
```
469+
470+
`asc()` and `desc()` will automatically respect aliases and quote the
471+
column names, whereas `sql()` simply uses the string given.
472+
473+
However, you can use another alias if required:
474+
475+
```
476+
$order2 = \TgDatabase\Order::desc(array('b', 'columnFromJoinedTable'));
477+
```
478+
479+
Finally add these objects to your query:
480+
481+
```
482+
$query->addOrder($order1, $order2);
483+
$query->addOrder($order3);
484+
```
485+
486+
## Getting the result
487+
That's the most easiest part:
488+
489+
```
490+
$query->list();
491+
```
492+
493+
You can set restrictions on the result:
494+
495+
```
496+
$query->setFirstResult(10);
497+
$query->setMaxResults(20);
498+
```
499+
500+
Or you expect a single row only:
501+
502+
```
503+
$query->first();
504+
```
505+
455506
## Using Projections
456507
Basic projections - the aggregation of columns of different rows - are available:
457508

@@ -489,24 +540,12 @@ And finally we apply the search condition for the author:
489540
$authors->add(Restrictions::like('name', 'A%'));
490541
```
491542

492-
## Getting the result
493-
That's the most easiest part:
494-
495-
```
496-
$query->list();
497-
```
498-
499-
You can set restrictions on the result:
543+
Another way of adding subqueries is directly via the main `Query` object:
500544

501545
```
502-
$query->setFirstResult(10);
503-
$query->setMaxResults(20);
504-
```
505-
506-
Or you expect a single row only:
507-
508-
```
509-
$query->first();
546+
$authors = $booksDAO->createQuery('a');
547+
$authors->createJoinedQuery('#__authors', 'b', Restrictions::eq(array('a','author'), array('b','uid')));
548+
$authors->add(Restrictions::like('name', 'A%'));
510549
```
511550

512551
## Updating and deleting multiple objects

src/TgDatabase/Order.php

+1-9
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,7 @@ public static function sql($sql) {
6969
*/
7070
public static function toOrder($order) {
7171
if (is_object($order)) return $order;
72-
73-
$s = trim($order);
74-
$pos = strrpos($s, ' ');
75-
if ($pos > 0) {
76-
$lastWord = strtolower(substr($s, $pos+1));
77-
if ($lastWord == 'desc') return Order::desc(substr($s, 0, $pos));
78-
if ($lastWord == 'asc') return Order::asc(substr($s, 0, $pos));
79-
}
80-
return Order::sql($s);
72+
return Order::sql($order);
8173
}
8274

8375
}

tests/TgDatabase/DaoTest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public function testCreateQueryCompatible(): void {
2323
$dao = TestHelper::getDao();
2424
if ($dao != NULL) {
2525
$query = $dao->createQuery(NULL, array('attr1' => 'value1', 'attr2' => 'value2'), array('attr3', 'attr4 DESC'), 3, 100);
26-
$this->assertEquals('SELECT * FROM `dual` WHERE ((`attr1` = \'value1\') AND (`attr2` = \'value2\')) ORDER BY `attr3`,`attr4` DESC LIMIT 100 OFFSET 3', $query->getSelectSql());
26+
$this->assertEquals('SELECT * FROM `dual` WHERE ((`attr1` = \'value1\') AND (`attr2` = \'value2\')) ORDER BY attr3,attr4 DESC LIMIT 100 OFFSET 3', $query->getSelectSql());
2727
}
2828
}
2929

@@ -32,7 +32,7 @@ public function testCreateQueryCompatibleAlias(): void {
3232
$dao = TestHelper::getDao();
3333
if ($dao != NULL) {
3434
$query = $dao->createQuery('a', array('attr1' => 'value1', 'attr2' => 'value2'), array('attr3', 'attr4 DESC'), 3, 100);
35-
$this->assertEquals('SELECT `a`.* FROM `dual` AS `a` WHERE ((`a`.`attr1` = \'value1\') AND (`a`.`attr2` = \'value2\')) ORDER BY `a`.`attr3`,`a`.`attr4` DESC LIMIT 100 OFFSET 3', $query->getSelectSql());
35+
$this->assertEquals('SELECT `a`.* FROM `dual` AS `a` WHERE ((`a`.`attr1` = \'value1\') AND (`a`.`attr2` = \'value2\')) ORDER BY attr3,attr4 DESC LIMIT 100 OFFSET 3', $query->getSelectSql());
3636
}
3737
}
3838

tests/TgDatabase/OrderTest.php

+9-4
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,12 @@ public function testDescIgnoreCase(): void {
3030
$expr = Order::desc('aName')->ignoreCase();
3131
$this->testSqlString('LOWER(`aName`) DESC', $expr);
3232
}
33-
33+
34+
public function testOrderSql(): void {
35+
$expr = Order::sql('RAND() ASC');
36+
$this->testSqlString('RAND() ASC', $expr);
37+
}
38+
3439
protected function testSqlString(string $expected, Order $expr, $alias = NULL): void {
3540
$query = TestHelper::createQuery(NULL, NULL, $alias);
3641
if ($query != NULL) {
@@ -42,23 +47,23 @@ public function testToOrderSimple(): void {
4247
$dao = TestHelper::getDao();
4348
if ($dao != NULL) {
4449
$query = $dao->createQuery();
45-
$this->assertEquals('`attr`', Order::toOrder('attr')->toSqlString($query, $query));
50+
$this->assertEquals('attr', Order::toOrder('attr')->toSqlString($query, $query));
4651
}
4752
}
4853

4954
public function testToOrderAsc(): void {
5055
$dao = TestHelper::getDao();
5156
if ($dao != NULL) {
5257
$query = $dao->createQuery();
53-
$this->assertEquals('`attr`', Order::toOrder('attr asc')->toSqlString($query, $query));
58+
$this->assertEquals('attr asc', Order::toOrder('attr asc')->toSqlString($query, $query));
5459
}
5560
}
5661

5762
public function testToOrderDesc(): void {
5863
$dao = TestHelper::getDao();
5964
if ($dao != NULL) {
6065
$query = $dao->createQuery();
61-
$this->assertEquals('`attr` DESC', Order::toOrder('attr desc')->toSqlString($query, $query));
66+
$this->assertEquals('attr desc', Order::toOrder('attr desc')->toSqlString($query, $query));
6267
}
6368
}
6469
}

0 commit comments

Comments
 (0)