phpgt/sqlbuilder

该软件包最新版本(v1.0.1)的许可信息不可用。

SQL查询的对象化表示。

资助软件包维护!
PhpGt

v1.0.1 2023-09-17 12:33 UTC

README

此库不生成任何SQL,而是提供SQL查询的对象化表示,允许开发者定义查询的结构,同时获得继承的好处。

当PHP应用程序达到规模时,数据库通常是性能瓶颈。当查询代表开发者生成时,它们往往难以优化,因为控制已经丢失。使用SqlBuilder,开发者始终控制原始SQL。

Build status Code quality Code coverage Current version PHP.Gt/SqlBuilder documentation

示例用法:表示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类具有相同的方法(selectfromwhere等),但将表达式作为参数,充当一个流畅接口

要使用流畅语法创建与上述示例相同的查询

$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"
);

条件

wherehaving子句中的表达式可以通过逻辑运算符连接,它们经常组合在一起。为了避免逻辑错误,使用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。