我正在try 用PHP OOP创建一个动态的WHERE子句构建器.我不确定我所做的是正确的.

因此,我创建了一个名为QueryBuilder的类,其中有一个名为$Filters的私有属性(这是一个用于存储筛选器的键和值的数组属性)和两个方法:

1,addFilter()->用于向查询添加"Filters"

2,getFilters()->这用于获取WHERE子句字符串和PDO Execute()的参数

以下是我的代码:

class QueryBuilder {

 private array $filters;

 public function addFilter(array $filterDetails): void
 {
    $this->filters[] = $filterDetails;

 }

public function getFilters(): array
 {
    $whereClause = " WHERE 1";
    if (!empty($this->filters)) {
        foreach ($this->filters as $filter) {
            $whereClause .= " AND (" . $filter["searchKey"] . " " . $filter["operator"] . " :" . $filter["searchKey"] . ")";
            $params[":" . $filter["searchKey"]] = $filter["searchValue"];
        }
        return ["whereClause" => $whereClause,
            "params"              => $params];
    }
    return ["whereClause" => $whereClause,
        "params"              => null];
  }

 }

我是这样运作的:

$QueryBuilder = new QueryBuilder();
$sql = "SELECT * FROM mytable";
$name = "Test Name";
$age = 12;
$QueryBuilder->addFilter(["operator" => "LIKE",
    "searchKey"                            => "name",
    "searchValue"                          => $name]);
$QueryBuilder->addFilter(["operator" => "=",
    "searchKey"                            => "age",
    "searchValue"                          => $age]);


$whereClause = $QueryBuilder->getFilters();
echo $sql . $whereClause["whereClause"];
echo "</br>";
echo "<pre>";
print_r($whereClause["params"]);
echo "</pre>";

结果似乎还不错:

SELECT * FROM mytable WHERE 1 AND (name LIKE :name) AND (age = :age)
Array
(
    [:name] => Test Name
    [:age] => 12
)

但现在我正在try 创建一个WHERE子句,其中是一个BETWEEN运算符,但我不知道如何在这段代码中实现.

无论如何,您认为这是创建查询(WHERE子句)构建器的好方法吗?或者我应该对代码进行一些修改?

谢谢!

推荐答案

您可以针对不同的事情使用特定的方法,而不是只有一个addFilter()种方法:

public function addWhereLike($columnName, $value);
public function addWhereEqual($columnName, $value);
public function addWhereBetween($columnName, $minimumValue, $maximumValue);

诸若此类.您现在应该在这些方法中处理方法参数,并将结果字符串存储在QueryBuilder对象中,而不是在getFilters()方法中一起处理它们.addWhereLike()addWhereEqual()都可以使用将运算符作为额外参数的私有方法addWhereWithOperator().

我也会把getFilters()重命名为getWherePartOfQuery().名称应该反映它所做的事情.

我还确信,最终,您希望您的QueryBuilder()实际构建整个查询,而不仅仅是WHERE位,所以请记住这一点.

NOTE:为了清楚起见,这个答案回答了您的问题,但我并不是说这是查询构建器的最佳解决方案.在这方面有过许多try ,有些比另一些更成功.您可能想要查找的术语是:ORM.尽管从技术上讲,这个术语并不总是与数据库相关,但它经常与数据库相关.

Php相关问答推荐

如何在WordPress中为特定自定义帖子类型自定义URL struct

make dd()如何正确工作?¨

未在moodle上运行的计划任务

在WooCommerce管理订单页面中显示区域名称

致命错误:未捕获错误:Google\Auth\HttpHandler\HttpHandlerFactory::build()

在Symfony 6.4中将工作流动态添加到服务

在WooCommerce获取所有具有全球产品属性品牌的简单产品

我有一个显示记录的表格,每行在最右边有两个按钮.如何才能以正确的顺序获得表的值?

模仿GUZLE中的curl 工作脚本(分块数据和二进制上传一起)

在WP工具中页面加载时可短暂看到的JavaScript生成的字段

Laravel 10中的Validator类

使用简码在 WooCommerce 我的帐户中显示一些用户数据

PHP 支持 APNG 文件吗?

WooCommerce 回购自定义插件:如何更新用户钱包?

如何处理 Null 上的 array_shift() ?

woocommerce checkout 页面上的自定义字段

如何将文件上传添加到 WooCommerce 结帐?

输出每个可能的产品选项

使用 OOP PHP 创建动态 WHERE 子句.如何实现 BETWEEN 运算符?

多排序子数组 - 包含范围数据的子数组