philiagus / pdostatementbuilder
PHP类,可轻松构建PDO语句
v1.4.0
2024-02-10 11:57 UTC
Requires
- php: >=8.1
- ext-pdo: *
Requires (Dev)
- ext-json: *
- ext-xdebug: *
- phpspec/prophecy-phpunit: ^2.0
- phpunit/phpunit: *
This package is auto-updated.
Last update: 2024-09-10 14:04:50 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的自动补全。