phpgt / sqlbuilder
SQL查询的对象化表示。
Requires
- php: >=8.0
Requires (Dev)
- phpmd/phpmd: ^2.13
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.3
- squizlabs/php_codesniffer: ^3.7
This package is auto-updated.
Last update: 2024-09-22 00:14:43 UTC
README
此库不生成任何SQL,而是提供SQL查询的对象化表示,允许开发者定义查询的结构,同时获得继承的好处。
当PHP应用程序达到规模时,数据库通常是性能瓶颈。当查询代表开发者生成时,它们往往难以优化,因为控制已经丢失。使用SqlBuilder,开发者始终控制原始SQL。
示例用法:表示SELECT查询的类
想象一个典型的数据库应用程序,它有一个student
表,用于存储每个学生的详细信息。一个基本的select可能看起来像这样
select id, forename, surname, dateOfBirth from student
上述查询将返回所有学生的列表。这里的问题是,当你再次需要从学生表中选择时,这次有一些限制,比如年龄范围或按姓氏排序,整个查询需要重复,并且只需要更改原始查询的一小部分。
相反,可以使用以下类来表示上述查询
class StudentSelect extends SelectQuery { public function select():array { return [ "id", "forename", "surname", "dateOfBirth", ]; } public function from():array { return [ "student", ]; } }
上述类的__toString
方法将产生与原始查询相同的SQL。
现在,要编写另一个查询,返回特定年龄的学生
class StudentSelectByAge extends StudentSelect { public function where():array { return [ "year(now()) - year(dateOfBirth) = :age", ]; } }
示例用法:构建SELECT查询的流畅类(即将在v2版本中发布)
如上例所示,SqlQuery
函数始终返回一个表达式数组。SqlBuilder
类具有相同的方法(select
、from
、where
等),但将表达式作为参数,充当一个流畅接口。
要使用流畅语法创建与上述示例相同的查询
$selectQuery = new SelectBuilder( "id", "forename", "surname", "dateOfBirth" )->from( "student" )->where( "year(now()) - year(dateOfBirth) = :age" );
这特别有用,当你有一个基础查询,比如StudentSelect
,而你只需要一个额外的条件。而无需为此创建一个单独的类,它可以直接调用
// Start by using a base StudentSelect, then add a single inline condition to it. $studentSelect = new StudentSelect(); $selectQuery = new SelectBuilder($studentSelect) ->where( "year(now()) - year(dateOfBirth) = :age" );
条件
在where
和having
子句中的表达式可以通过逻辑运算符连接,它们经常组合在一起。为了避免逻辑错误,使用Condition
对象来指定逻辑的优先级。
例如,要选择具有特定年龄和性别的学生
class StudentSelectByAge extends StudentSelect { public function where():array { return [ new AndCondition("year(now()) - year(dateOfBirth) = :age"), new AndCondition("gender = :gender"), ]; } }
子查询
SqlQuery
对象具有一个__toString()
函数,SqlBuilder
结果创建SqlQuery
实例。因此,它们可以在查询或构建器的任何其他表达式中使用。
纯SQL的限制
纯SQL提供的唯一工具,可用于编写DRY代码,是视图和存储过程,两者在编写干净和可维护的代码时都有自己的限制。
该库提供的解决方案是将SQL查询分解为其不同的部分,每个部分由一个PHP类表示,这些类可以被其他类扩展,同时仍然保留所表示的纯SQL语句。
SQL兼容性
按设计,该库不提供任何SQL处理功能。任何特定的驱动程序SQL将与其他驱动程序不兼容。这允许开发者充分利用他们选择的SQL驱动程序,而不是生成通用的 SQL。