mirror of
https://gitlab.com/hashborgir/d2tools.git
synced 2025-11-02 08:47:46 -06:00
Begin Refactor
This commit is contained in:
56
vendor/gabordemooij/redbean/RedBeanPHP/Plugin/TinyQueryBuilder.php
vendored
Normal file
56
vendor/gabordemooij/redbean/RedBeanPHP/Plugin/TinyQueryBuilder.php
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
<?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;
|
||||
});
|
||||
Reference in New Issue
Block a user