rain1/condition-builder

逻辑表达式的条件构建器

1.0.0 2022-05-15 21:04 UTC

This package is auto-updated.

Last update: 2024-09-17 01:42:26 UTC


README

Build Status

此包允许您为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 语句一起使用它时,请格外小心。