rain1 / condition-builder
逻辑表达式的条件构建器
1.0.0
2022-05-15 21:04 UTC
Requires
- php: >= 7.4
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^6.5
- satooshi/php-coveralls: ^2.0
This package is auto-updated.
Last update: 2024-09-17 01:42:26 UTC
README
此包允许您为PDO类似接口构建查询条件。
这不是一个ORM:它是一个条件构建器。让我们看看例子
用法
<?php require_once "vendor/autoload.php"; use rain1\ConditionBuilder\ConditionBuilder; use rain1\ConditionBuilder\Operator\IsEqual; use rain1\ConditionBuilder\Operator\IsLess; $condition = new ConditionBuilder(ConditionBuilder::MODE_AND); $condition->append( new IsEqual("id", 3), // id = ? AND new IsLess("priority", 100), // priority < ? AND new IsEqual("myCol", [1,2,3]), // myCol IN (?,?,?) new IsEqual("anotherCol", null), // it will be ignored because null value (new ConditionBuilder(ConditionBuilder::MODE_OR)) ->append( new IsEqual("col1", 3), // col1 = ? OR new IsEqual("someflag", 0) // someflag = ? ) ); $query = "SELECT * FROM myTable WHERE $condition"; echo $query."\n"; print_r($condition()); // shortcut of $condition->values() it returns an array with all values //$res = $pdo->prepare($query)->execute($condition->values());
这将产生以下输出
SELECT * FROM myTable WHERE (id = ? AND priority < ? AND myCol IN (?,?,?) AND (col1 = ? OR someflag = ?))
Array
(
[0] => 3
[1] => 100
[2] => 1
[3] => 2
[4] => 3
[5] => 3
[6] => 0
)
魔法在哪里?
好吧,假设我们想要编写一个函数来过滤MySQL表中的行。通常,如果我们不使用某些魔法框架或ORM,我们必须编写很多 if
条件,并必须拼接查询和推送参数值。
这就是ConditionBuilder内部的工作。
<?php function filterUser(array $filters = []) : array { $defaults = [ 'id' => null, 'banned' => null, 'last_login_range_start' => null, 'last_login_range_end' => null, 'email' => null, ]; $filters = $filters + $defaults; $condition = new ConditionBuilder(ConditionBuilder::MODE_AND); $condition->append( new IsEqual('id', $filters['id']), new IsEqual('email', $filters['email']), new IsEqual('banned', $filters['banned']), new IsBetween("last_login", $filters["last_login_range_start"], $filters["last_login_range_end"]) ); return YourMysqlLibrary::query("SELECT * FROM user WHERE $condition", $condition()); } $rows = filterUser([ 'id' => [1,2,3] ]); // users with id 1,2 or 3 $rows = filterUser([ 'last_login_range_start' => date("Y-m-d 00:00:00", "yesterday"), 'banned' => 0 ]); // users not banned and logged yesterday or today $rows = filterUser([ 'last_login_range_start' => "2021-01-01", 'last_login_range_end' => "2021-01-31", 'banned' => 1 ]); // users actually banned and last seen in Jan 2021 $rows = filterUser([ 'email' => "user@example.org" ]); // user with specified email // and so on
因此,您可以使用最小的函数轻松构建许多搜索。
当然,它是一个简单的条件助手,因此您的查询可以更复杂。您可以使用多个ConditionBuilder,并将它们附加到另一个。
请注意
如果ConditionBuilder为空(这意味着所有过滤器都是null),则结果将为
(TRUE)
,如果模式是ConditionBuilder::MODE_AND(FALSE)
,如果模式是ConditionBuilder::MODE_OR
所以,特别是如果您与 DELETE
语句一起使用它时,请格外小心。