philiagus/pdostatementbuilder

PHP类,可轻松构建PDO语句

v1.4.0 2024-02-10 11:57 UTC

README

PHP类,可轻松构建PDO语句。

有关所有更新信息,请参阅 UPDATE.md

这是什么?

一种简单的方法,以可读的方式构建复杂的PDOStatements。想要为项目构建一个过于复杂的过滤SQL吗?这就是你要用的项目!

是否覆盖了?

  • 100% 测试覆盖
  • 测试环境
    • PHP8.0
    • PHP8.1
    • PHP8.2
    • PHP8.3

为什么做这些?

在数据库相关编码中,根据提供给存储库的一组输入参数构建语句是非常常见的。这通常看起来像这样

class SomeRepository
{
    /**
     * @type \PDO
     */
    private $pdo;

    function getSomething(array $ids, bool $someFilter = false, ?int $exlude = null): array
    {
        if (empty($ids)) {
            return [];
        }
        $statement = "SELECT *
                FROM `table`
                WHERE id IN (?" . str_repeat(',?', count($ids) - 1) . ")";
        $params = array_values($ids);

        if ($someFilter) {
            $statement .= " AND `filter_field` IS NOT NULL AND `filter_field2` = 1";
        }

        if ($exlude !== null) {
            $statement .= ' AND `explude_column` = ?';
            $params[] = $exlude;
        }

        $statement = $this->pdo->prepare($statement);
        $statement->execute($params);

        return $statement->fetchAll(\PDO::FETCH_ASSOC);
    }
}

与以下代码比较

class SomeRepository
{
    /**
     * @type \PDO
     */
    private $pdo;

    function getSomething(array $ids, bool $someFilter = false, ?int $exclude = null): array
    {
        if (empty($ids)) {
            return [];
        }

        $builder = new \Philiagus\PDOStatementBuilder\Builder();
        $sql = $builder->build("
            SELECT *
            FROM table
            WHERE id IN ({$builder->in($ids)})
            /* {$builder->if($someFilter)} */
                AND `filter_field` IS NOT NULL AND `filter_field2` = 1
            /* {builder->endif()} */
            /* {builder->if($exclude !== null)} */
                AND `explude_column` = {$builder->value($exclude)}
            /* {$builder->endif()} */
            "
        );

        $statement = $sql->prepare($this->pdo);
        $statement->execute();
        return $statement->fetchAll(\PDO::FETCH_ASSOC);
    }
}

代码实际上做的是同样的事情,但SQL是可读的。此外,IDE如PHPStorm可以帮助你完成SQL的自动补全。