mirror of
https://gitlab.com/hashborgir/d2tools.git
synced 2025-04-27 14:55:38 +00:00
57 lines
1.8 KiB
PHP
57 lines
1.8 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Tiny Query Builder
|
|
*
|
|
* <code>
|
|
* $sql = build_query([
|
|
* [ 'SELECT * FROM book'],
|
|
* [$title ,'WHERE','title = ?'],
|
|
* [$price ,'AND','price < ?'],
|
|
* [$order ,'ORDER BY ? ASC'],
|
|
* [$limit ,'LIMIT ?']
|
|
* ]);
|
|
* </code>
|
|
*
|
|
* Now, if we have a $title and a $price the query will be:
|
|
* 'SELECT * FROM book WHERE title = ? AND price < ? '
|
|
* If we only have a $price and a $limit:
|
|
* 'SELECT * FROM book WHERE price < ? LIMIT ?'
|
|
* The Query Builder works very easy, it simply loops through the array,
|
|
* each element is another array inside this main array,
|
|
* let's call this inner array a 'piece'.
|
|
* A piece can have one, two or three elements.
|
|
* If it has one element, the element is simply concatenated to the final query.
|
|
* If a piece has two elements, the second element will be
|
|
* concatenated only if the first evaluates to TRUE.
|
|
* Finally a piece having three elements works the same as a piece with two elements,
|
|
* except that it will use the glue provided in the second element
|
|
* to concat the value of the third element. The glue acts as a little tube of glue.
|
|
* If there is still glue left in the tube (WHERE) it will preserve this
|
|
* until it can be applied (so the first AND will be ignored in case of a WHERE condition).
|
|
*/
|
|
R::ext('buildQuery', function($pieces) {
|
|
$sql = '';
|
|
$glue = NULL;
|
|
foreach( $pieces as $piece ) {
|
|
$n = count( $piece );
|
|
switch( $n ) {
|
|
case 1:
|
|
$sql .= " {$piece[0]} ";
|
|
break;
|
|
case 2:
|
|
$glue = NULL;
|
|
if (!is_null($piece[0])) $sql .= " {$piece[1]} ";
|
|
break;
|
|
case 3:
|
|
$glue = ( is_null( $glue ) ) ? $piece[1] : $glue;
|
|
if (!is_null($piece[0])) {
|
|
$sql .= " {$glue} {$piece[2]} ";
|
|
$glue = NULL;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return $sql;
|
|
});
|