类 SelectQuery
扩展 Cake\Database\Query\SelectQuery 类,提供与关联加载、自动字段选择、自动类型转换相关的新方法,并将结果包装到一个特定的迭代器中,该迭代器将负责在需要时对结果进行水化。
常量
-
int
APPEND ¶0
表示操作应该附加到列表中
-
string
JOIN_TYPE_INNER ¶'INNER'
-
string
JOIN_TYPE_LEFT ¶'LEFT'
-
string
JOIN_TYPE_RIGHT ¶'RIGHT'
-
bool
OVERWRITE ¶true
表示操作应该覆盖列表
-
int
PREPEND ¶1
表示操作应该预先添加到列表中
-
string
TYPE_DELETE ¶'delete'
-
string
TYPE_INSERT ¶'insert'
-
string
TYPE_SELECT ¶'select'
-
string
TYPE_UPDATE ¶'update'
属性摘要
-
$_autoFields protected
bool|null
跟踪原始查询是否应包含来自顶级表的字段。
-
$_beforeFindFired protected
bool
如果此查询的 beforeFind 事件已触发,则为真
-
$_cache protected
Cake\Datasource\QueryCacher|null
如果此查询已启用缓存,则为一个查询缓存实例。
-
$_connection protected
Cake\Database\Connection
要用于执行此查询的连接实例。
-
$_counter protected
Closure|null
一个回调函数,用于计算此查询将匹配的记录总数,当不使用
limit
时 -
$_dirty protected
bool
指示此查询的内部状态是否已更改,这用于丢弃内部缓存的对象,例如转换后的查询或对已执行语句的引用。
-
$_eagerLoaded protected
bool
查询是独立的还是预加载操作的结果。
-
$_eagerLoader protected
Cake\ORM\EagerLoader|null
一个类的实例,负责存储关联包含并在此查询执行时预加载它们
-
$_formatters protected
arrayClosure>
格式化器类或回调函数的列表,这些类或回调函数将在提取时对结果进行后处理
-
$_functionsBuilder protected
Cake\Database\FunctionsBuilder|null
用于生成任意 SQL 函数的函数构建器对象的实例。
-
$_hasFields protected
bool|null
用户是否在执行之前选择了任何字段,这用于确定是否应自动选择任何字段。
-
$_hydrate protected
bool
是否将结果水化为实体对象
-
$_mapReduce protected
array
应该应用于查询结果的映射-归约例程列表
-
$_options protected
array
保存使用 applyOptions 传递的任何自定义选项,这些选项无法通过此类中的任何方法处理。
-
$_parts protected
array<string, mixed>
将用于构建此查询的 SQL 部分列表。
-
$_repository protected
Cake\ORM\Table
此查询绑定到的存储库/表对象的实例。
-
$_resultDecorators protected
listClosure>
一个回调函数列表,这些回调函数将在检索后被调用以更改来自结果语句的每一行。每个回调函数将接收行数组作为第一个参数。
-
$_results protected
iterable|null
一个 ResultSet。
-
$_resultsCount protected
int|null
查询的 COUNT(*)。
-
$_selectTypeMap protected
Cake\Database\TypeMap|null
选择子句中字段的类型映射
-
$_statement protected
Cake\Database\StatementInterface|null
-
$_type protected
string
此查询的类型。
-
$_typeMap protected
Cake\Database\TypeMap|null
-
$_valueBinder protected
Cake\Database\ValueBinder|null
负责生成查询占位符并临时存储与每个占位符关联的值的对象。
-
$aliasingEnabled protected
bool
是否为字段生成别名。
-
$bufferedResults protected
bool
用于跟踪是否启用了缓冲结果的布尔值。
-
$connectionRole protected
string
连接角色 ('read' 或 'write')
-
$resultSetFactory protected
Cake\ORM\ResultSetFactoryCake\Datasource\EntityInterface|array>
结果集工厂
-
$typeCastEnabled protected
bool
跟踪标志,用于禁用强制转换
方法摘要
-
__clone() public
处理清除迭代器并克隆所有表达式和值绑定器。
-
__construct() public
构造函数
-
__debugInfo() public
返回一个数组,该数组可用于描述此对象的内部状态。
-
__toString() public
返回此查询的字符串表示形式(完整的 SQL 语句)。
-
_addAssociationsToTypeMap() protected
用于递归地将包含的关联列类型添加到查询中。
-
_addDefaultFields() protected
检查是否有任何设置的字段用于选择,否则添加默认表的全部字段。
-
_addDefaultSelectTypes() protected
设置选择子句中字段转换的默认类型
-
_conjugate() protected
帮助函数,用于通过组合 QueryExpression 对象来构建条件。
-
_decorateResults() protected
使用映射-归约例程和格式化器装饰结果迭代器
-
_dirty() protected
将查询标记为脏,从内存缓存中删除任何预处理的信息,例如以前的结果
-
_execute() protected
执行此查询并返回包含结果的迭代器。
-
_expressionsVisitor() protected
traverseExpressions() 使用的查询部分遍历方法
-
_makeJoin() protected
返回一个可以传递给 join 方法的数组,描述一个单独的连接子句。
-
_performCount() protected
执行并返回查询的 COUNT(*)。
-
_transformQuery() protected
在查询对象执行之前应用一些默认值。
-
addDefaultTypes() public
提示此对象在为数据库转换条件时关联正确的类型。 这是通过从与传递的表对象关联的模式中提取字段类型来完成的。 这可以防止用户在指定条件时重复自己。
-
aliasField() public
返回一个键 => 值数组,表示一个单独的别名字段,可以直接传递给 select() 方法。 键将包含别名,值将包含实际字段名称。
-
aliasFields() public
对提供的列表中的每个字段运行
aliasField()
并将结果放在一个单独的数组中返回。 -
all() public
获取此查询的结果。
-
andHaving() public
使用 HAVING 子句中的 AND 运算符将任何先前定义的条件集连接到提供的列表。 此方法的操作方式与
andWhere()
方法完全相同。 请参考其文档以了解如何使用每个参数。 -
andWhere() public @method
使用 AND 运算符将任何先前定义的条件集连接到提供的列表。 {@see \Cake\Database\Query::andWhere()}
-
applyOptions() public
使用数组填充或添加当前查询子句的部分。 这对于一次传递所有查询子句非常方便。
-
bind() public
将查询占位符与值和类型关联起来。
-
cache() public
为此查询启用结果缓存。
-
clause() public
返回存储在指定子句中的任何数据。 这对于修改查询的任何内部部分很有用,并且 SQL 方言使用它在查询执行之前相应地转换查询。 可以检索的有效子句是:delete、update、set、insert、values、select、distinct、from、join、set、where、group、having、order、limit、offset、union 和 intersect。
-
cleanCopy() public
创建当前查询的副本,触发 beforeFind 并重置一些状态。
-
clearContain() public
从当前查询中清除包含的关联。
-
clearResult() public
从当前查询对象中清除内部结果缓存和内部计数值。
-
comment() public
一个字符串或表达式,将作为注释附加到生成的查询。
-
contain() public
设置应该与该查询一起急切加载的关联列表。 传递的关联表列表必须使用 Table API 之前已设置为关联。
-
count() public
返回查询的总结果数。
-
counter() public
注册一个回调,它将在该查询中的
count
方法被调用时执行。 函数的返回值将被设置为count
方法的返回值。 -
decorateResults() public
注册一个回调,该回调将在从结果集中获取每个结果时执行,回调函数将接收第一个参数,该参数是一个数组,其中包含来自数据库的原始数据,用于获取的每一行,并且必须返回该行,并带有任何可能的修改。
-
disableAutoAliasing() public
禁用自动将表的别名添加到 SELECT 子句的字段中。
-
disableAutoFields() public
禁用自动追加字段。
-
disableBufferedResults() public
禁用缓冲结果。
-
disableHydration() public
禁用水化实体。
-
disableResultsCasting() public
禁用结果转换。
-
distinct() public
在查询中添加
DISTINCT
子句以从结果集中删除重复项。 此子句只能用于 select 语句。 -
eagerLoaded() public
将查询实例设置为急切加载的查询。 如果没有传递参数,则返回当前配置的查询
_eagerLoaded
值。 -
enableAutoFields() public
设置 ORM 是否应该自动追加字段。
-
enableBufferedResults() public
启用缓冲结果。
-
enableHydration() public
切换水化实体。
-
enableResultsCasting() public
启用结果转换。
-
epilog() public
一个字符串或表达式,将附加到生成的查询。
-
execute() public
编译此查询的 SQL 表示形式,并使用配置的连接对象执行它。 返回结果语句对象。
-
expr() public
返回一个新的 QueryExpression 对象。 当使用流畅的接口构建复杂查询时,这是一个方便的函数。 您也可以在子类中覆盖此函数,以在需要时使用更专业的 QueryExpression 类。
-
find() public
对现有的查询对象应用自定义查找。
-
first() public
返回执行此查询的第一个结果,如果该查询之前没有执行过,则出于性能原因,它会将 limit 子句设置为 1。
-
firstOrFail() public
从执行查询中获取第一个结果或引发异常。
-
formatResults() public
注册一个新的格式化回调函数,该函数将在尝试从数据库中获取结果时执行。
-
from() public
添加一个或多个表,这些表将在此查询的 FROM 子句中使用。 表可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
-
func() public
返回一个函数构建器对象的实例,该对象可用于生成任意 SQL 函数。
-
getConnection() public
获取用于执行和转换此查询的连接实例。
-
getConnectionRole() public
返回连接角色('read' 或 'write')。
-
getContain() public
-
getDefaultTypes() public
获取当前类型图的默认类型。
-
getEagerLoader() public
返回当前配置的实例。
-
getIterator() public
执行此查询并返回结果迭代器。 此函数是实现 IteratorAggregate 接口所必需的,它允许迭代查询,而无需手动调用 execute(),从而使查询看起来像结果集而不是查询本身。
-
getMapReducers() public
返回先前注册的映射缩减例程的列表。
-
getOptions() public
返回一个包含应用于此查询的自定义选项的数组,这些选项尚未由该类的其他方法处理。
-
getRepository() public
返回此查询将使用的默认存储库对象,即将在 from 子句中出现的表。
-
getResultDecorators() public
获取结果装饰器。
-
getResultFormatters() public
返回先前注册的格式例程的列表。
-
getSelectTypeMap() public
获取 TypeMap 类,其中存储了 select 子句中每个字段的类型。
-
getTypeMap() public
返回现有的类型图。
-
getValueBinder() public
返回当前使用的 ValueBinder 实例。
-
group() public deprecated
添加一个或多个字段,这些字段将在此查询的 GROUP BY 子句中使用。 字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
-
groupBy() public
添加一个或多个字段,这些字段将在此查询的 GROUP BY 子句中使用。 字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
-
having() public
添加一个或多个条件,这些条件将在此查询的
HAVING
子句中使用。 此方法的操作方式与where()
方法完全相同。 请参考其文档以了解如何使用每个参数。 -
identifier() public
创建一个引用标识符的表达式。 标识符用于引用字段名称,并允许 SQL 编译器应用引号或转义标识符。
-
innerJoin() public
在查询中添加一个单独的
INNER JOIN
子句。 -
innerJoinWith() public
使用传递的关联表创建 INNER JOIN,同时保留最初为其设置的外键匹配和自定义条件。
-
intersect() public
添加一个完整的查询,该查询将与该查询的 INTERSECT 运算符一起使用。 这用于将此查询的结果集与传递的查询将返回的结果集结合起来。 您可以通过使用不同的查询多次调用此方法来添加任意多个查询。
-
intersectAll() public
添加一个完整的查询,该查询将与该查询的 INTERSECT ALL 运算符一起使用。 这用于将此查询的结果集与传递的查询将返回的结果集结合起来。 您可以通过使用不同的查询多次调用此方法来添加任意多个查询。
-
isAutoFieldsEnabled() public
获取 ORM 是否应该自动追加字段。
-
isBufferedResultsEnabled() public
返回是否启用/禁用缓冲结果。
-
isEagerLoaded() public
返回当前配置的查询
_eagerLoaded
值 -
isHydrationEnabled() public
返回当前的水合模式。
-
isResultsCastingEnabled() public
返回结果转换是否启用/禁用。
-
join() public
添加一个或多个表作为 JOIN 子句用于此查询。表可以作为字符串数组、描述连接部分的数组、包含多个连接描述的数组或单个字符串传递。
-
jsonSerialize() public
执行查询并将结果集转换为 JSON。
-
leftJoin() public
向查询添加一个
LEFT JOIN
子句。 -
leftJoinWith() public
使用传递的关联表创建一个 LEFT JOIN,同时保留外键匹配以及最初为其设置的自定义条件。
-
limit() public
设置应从数据库中检索的记录数量,接受整数或计算结果为整数的表达式对象。在某些数据库中,此操作可能不受支持,或者需要转换查询才能限制结果集的大小。
-
mapReduce() public
注册一个新的 MapReduce 例程,该例程将在数据库结果之上执行。
-
matching() public
向此查询添加过滤条件,以仅获取与关联表中的另一行具有关系的行,这些关系基于关联表中的条件。
-
modifier() public
添加一个或多个
SELECT
修饰符,用于SELECT
中。 -
newExpr() public
返回一个新的 QueryExpression 对象。 当使用流畅的接口构建复杂查询时,这是一个方便的函数。 您也可以在子类中覆盖此函数,以在需要时使用更专业的 QueryExpression 类。
-
notMatching() public
向此查询添加过滤条件,以仅获取与关联表中的另一行没有匹配的行,这些关系基于关联表中的条件。
-
offset() public
设置应从原始结果集中跳过的记录数量。这通常用于对大型结果进行分页。接受整数或计算结果为整数的表达式对象。
-
order() public deprecated
添加一个或多个字段,用于此查询的 ORDER 子句中。字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
-
orderAsc() public deprecated
添加具有 ASC 方向的 ORDER BY 子句。
-
orderBy() public
添加一个或多个字段,用于此查询的 ORDER 子句中。字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
-
orderByAsc() public
添加具有 ASC 方向的 ORDER BY 子句。
-
orderByDesc() public
添加具有 DESC 方向的 ORDER BY 子句。
-
orderDesc() public deprecated
添加具有 DESC 方向的 ORDER BY 子句。
-
page() public
设置所需的页面结果。
-
removeJoin() public
如果已定义,则删除连接。
-
resultSetFactory() public
获取结果集工厂。
-
rightJoin() public
向查询添加一个
RIGHT JOIN
子句。 -
rowCountAndClose() public
执行此查询的 SQL,并在返回已更改记录的行数之前立即关闭语句。
-
select() public
添加要由
SELECT
语句返回的新字段,当执行此查询时。字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。 -
selectAllExcept() public
除排除字段外,与传递的表关联的所有字段都将添加到查询的 select 子句中。传递的排除字段不应别名。在第一次调用此方法后,第二次调用不能用于删除已通过第一次调用添加到查询中的字段。如果您需要在第一次调用后更改列表,请传递覆盖布尔值 true,它将重置 select 子句,删除所有先前的添加。
-
selectAlso() public
行为与
select()
完全相同,除了将字段添加到选定字段列表中,并且不会禁用自动选择关联的字段。 -
setConnection() public
设置用于执行和转换此查询的连接实例。
-
setConnectionRole() public
设置连接角色。
-
setDefaultTypes() public
覆盖实现对象中字段的默认类型映射。
-
setEagerLoader() public
设置要用于加载关联和存储包含的渴望加载器类的实例。
-
setRepository() public
设置将由此查询使用并构成
FROM
子句的默认 Table 对象。 -
setResult() public
为查询设置结果集。
-
setSelectTypeMap() public
设置 TypeMap 类,其中存储 select 子句中每个字段的类型。
-
setTypeMap() public
如果 $typeMap 是一个数组,则创建一个新的 TypeMap,否则将其替换为给定的 TypeMap。
-
setValueBinder() public
覆盖当前值绑定器。
-
sql() public
返回此对象的 SQL 表示形式。
-
toArray() public
在执行查询后,返回结果的数组表示形式。
-
traverse() public
将迭代每个指定的部件。遍历函数可以使用闭包或实例变量中的变量聚合结果。此函数通常用作遍历所有将用于构建查询的查询部分的方法。
-
traverseExpressions() public
此函数的工作原理类似于 traverse() 函数,不同之处在于它对整个表达式树进行全深度遍历。这将对存储在此查询中的每个 ExpressionInterface 对象执行提供的回调函数,无论它在查询的任何部分的任何嵌套深度。
-
traverseParts() public
将迭代提供的部分。
-
triggerBeforeFind() public
在查询的存储库对象上触发 beforeFind 事件。
-
type() public
返回此查询的类型(select、insert、update、delete)
-
union() public
添加一个完整的查询,用于与此查询的 UNION 运算符一起使用。这用于将此查询的结果集与传递的查询返回的结果集相结合。您可以通过使用不同的查询多次调用此方法来添加所需的查询。
-
unionAll() public
添加一个完整的查询,用于与此查询的 UNION ALL 运算符一起使用。这用于将此查询的结果集与传递的查询返回的结果集相结合。您可以通过使用不同的查询多次调用此方法来添加所需的查询。
-
useReadRole() public
将连接角色设置为读取。
-
useWriteRole() public
将连接角色设置为写入。
-
where() public
添加一个条件或一组条件,用于此查询的 WHERE 子句中。条件可以表示为键为字段的数组,其中包含比较运算符,数组的值将用于将字段与该文字进行比较。最后,条件可以表示为单个字符串或字符串数组。
-
whereInList() public
添加一个 IN 条件或一组条件,用于此查询的 WHERE 子句中。
-
whereNotInList() public
添加一个 NOT IN 条件或一组条件,用于此查询的 WHERE 子句中。
-
whereNotInListOrNull() public
添加一个 NOT IN 条件或一组条件,用于此查询的 WHERE 子句中。这还允许字段为 null,并使用 IS NULL 条件,因为 null 值会导致 NOT IN 条件始终失败。
-
whereNotNull() public
便利方法,向查询添加 NOT NULL 条件。
-
whereNull() public
便利方法,向查询添加 IS NULL 条件。
-
window() public
添加一个命名的窗口表达式。
-
with() public
向查询添加一个新的通用表表达式 (CTE)。
方法详细说明
__debugInfo() ¶ public
__debugInfo(): array<string, mixed>
返回一个数组,该数组可用于描述此对象的内部状态。
返回
array<string, mixed>
_addAssociationsToTypeMap() ¶ protected
_addAssociationsToTypeMap(Cake\ORM\Table $table, Cake\Database\TypeMap $typeMap, array<string, array> $associations): void
用于递归地将包含的关联列类型添加到查询中。
参数
-
Cake\ORM\Table
$table 要从中获取关联的表实例。
-
Cake\Database\TypeMap
$typeMap 要检查列的 typemap。 此 typemap 通过 {@link \Cake\ORM\Query\SelectQuery::addDefaultTypes()} 被间接修改
-
array<string, array>
$associations 要遍历的关联嵌套树。
返回
void
_conjugate() ¶ protected
_conjugate(string $part, Cake\Database\ExpressionInterfaceClosure|array|string|null $append, string $conjunction, array<string, string> $types): void
帮助函数,用于通过组合 QueryExpression 对象来构建条件。
参数
-
string
$part 要将新部分追加到的查询部分的名称
-
Cake\Database\ExpressionInterfaceClosure|array|string|null
$append 要追加的表达式或生成器函数。
-
string
$conjunction 用于操作部分的连接类型
-
array<string, string>
$types 用于将值绑定到查询的类型名称的关联数组
返回
void
_decorateResults() ¶ protected
_decorateResults(iterable $result): Cake\Datasource\ResultSetInterfaceCake\Datasource\EntityInterface|mixed>
使用映射-归约例程和格式化器装饰结果迭代器
参数
-
iterable
$result 原始结果
返回
Cake\Datasource\ResultSetInterfaceCake\Datasource\EntityInterface|mixed>
_expressionsVisitor() ¶ protected
_expressionsVisitor(mixed $expression, Closure $callback): void
traverseExpressions() 使用的查询部分遍历方法
参数
-
mixed
$expression 查询表达式或表达式数组。
-
Closure
$callback 对在此查询中找到的每个 ExpressionInterface 执行的回调。
返回
void
_makeJoin() ¶ protected
_makeJoin(array<string, mixed>|string $table, Cake\Database\ExpressionInterfaceClosure|array|string $conditions, string $type): array
返回一个可以传递给 join 方法的数组,描述一个单独的连接子句。
参数
-
array<string, mixed>|string
$table 要连接的表
-
Cake\Database\ExpressionInterfaceClosure|array|string
$conditions 用于连接的条件。
-
string
$type 要使用的连接类型
返回
array
_transformQuery() ¶ protected
_transformQuery(): void
在查询对象执行之前应用一些默认值。
具体添加 FROM 子句,如果未指定则添加默认表字段,并应用急切加载使用 contain
定义的关联所需的连接
它还为 select 子句中的列设置默认类型
返回
void
另请参见
addDefaultTypes() ¶ public
addDefaultTypes(Cake\ORM\Table $table): $this
提示此对象在为数据库转换条件时关联正确的类型。 这是通过从与传递的表对象关联的模式中提取字段类型来完成的。 这可以防止用户在指定条件时重复自己。
此方法返回相同的查询对象以进行链接。
参数
-
Cake\ORM\Table
$table 要从中提取类型的表
返回
$this
aliasField() ¶ public
aliasField(string $field, string|null $alias = null): array<string, string>
返回一个键 => 值数组,表示一个单独的别名字段,可以直接传递给 select() 方法。 键将包含别名,值将包含实际字段名称。
如果该字段已具有别名,则不会更改它。 如果未传递 $alias,则将使用此查询的默认表。
参数
-
string
$field 要设置别名的字段
-
string|null
$alias 可选 用于为字段添加前缀的别名
返回
array<string, string>
aliasFields() ¶ public
aliasFields(array $fields, string|null $defaultAlias = null): array<string, string>
对提供的列表中的每个字段运行 aliasField()
并将结果放在一个单独的数组中返回。
参数
-
array
$fields 要设置别名的字段
-
string|null
$defaultAlias 可选 默认别名
返回
array<string, string>
all() ¶ public
all(): Cake\Datasource\ResultSetInterface<mixed>
获取此查询的结果。
将返回通过 setResult() 设置的结果集,或者执行此查询并返回 ResultSetDecorator 对象,该对象已准备好进行结果流式传输。
ResultSetDecorator 是一个可遍历对象,它实现了 Cake\Collection\Collection 上找到的方法。
返回
Cake\Datasource\ResultSetInterface<mixed>
andHaving() ¶ public
andHaving(Cake\Database\ExpressionInterfaceClosure|array|string $conditions, array<string, string> $types = []): $this
使用 HAVING 子句中的 AND 运算符将任何先前定义的条件集连接到提供的列表。 此方法的操作方式与 andWhere()
方法完全相同。 请参考其文档以了解如何使用每个参数。
Having 字段不适合与用户提供的数据一起使用,因为它们没有经过查询生成器的清理。
参数
-
Cake\Database\ExpressionInterfaceClosure|array|string
$conditions HAVING 的 AND 条件。
-
array<string, string>
$types 可选 用于将值绑定到查询的类型名称的关联数组
返回
$this
另请参见
andWhere() ¶ public @method
andWhere(Cake\Database\ExpressionInterfaceClosure|array|string $conditions, array $types = []): $this
使用 AND 运算符将任何先前定义的条件集连接到提供的列表。 {@see \Cake\Database\Query::andWhere()}
重要的是要注意,在调用此函数时,为该查询定义的任何先前条件集将被视为 AND 运算符的单个参数。 此函数不仅会对最近定义的条件进行运算,还会对所有条件进行整体运算。
在使用数组定义条件时,从每个数组条目创建约束将使用与 where()
函数相同的逻辑。 这意味着每个数组条目将使用 AND 运算符连接到另一个条目,除非您使用其他运算符在数组中嵌套条件。
示例
$query->where(['title' => 'Hello World')->andWhere(['author_id' => 1]);
将生成
WHERE title = 'Hello World' AND author_id = 1
$query
->where(['OR' => ['published' => false, 'published is NULL']])
->andWhere(['author_id' => 1, 'comments_count >' => 10])
产生
WHERE (published = 0 OR published IS NULL) AND author_id = 1 AND comments_count > 10
$query
->where(['title' => 'Foo'])
->andWhere(function ($exp, $query) {
return $exp
->or(['author_id' => 1])
->add(['author_id' => 2]);
});
生成以下条件
WHERE (title = 'Foo') AND (author_id = 1 OR author_id = 2)
参数
-
Cake\Database\ExpressionInterfaceClosure|array|string
$conditions -
array
$types 可选
返回
$this
applyOptions() ¶ public
applyOptions(array<string, mixed> $options): $this
使用数组填充或添加当前查询子句的部分。 这对于一次传递所有查询子句非常方便。
该方法接受以下与查询子句相关的选项
- fields: 映射到 select 方法
- conditions: 映射到 where 方法
- limit: 映射到 limit 方法
- order: 映射到 order 方法
- offset: 映射到 offset 方法
- group: 映射到 group 方法
- having: 映射到 having 方法
- contain: 映射到急切加载的 contain 选项
- join: 映射到 join 方法
- page: 映射到 page 方法
所有其他选项都不会影响查询,但将被存储为自定义选项,可以通过 getOptions()
读取。 此外,它们会自动传递给 Model.beforeFind
。
示例
$query->applyOptions([
'fields' => ['id', 'name'],
'conditions' => [
'created >=' => '2013-01-01'
],
'limit' => 10,
]);
等同于
$query
->select(['id', 'name'])
->where(['created >=' => '2013-01-01'])
->limit(10)
自定义选项可以通过 getOptions()
读取
$query->applyOptions([
'fields' => ['id', 'name'],
'custom' => 'value',
]);
这里 $options
将保存 ['custom' => 'value']
(fields
选项将应用于查询,而不是存储,因为它是一个与查询子句相关的选项)
$options = $query->getOptions();
参数
-
array<string, mixed>
$options 要应用的选项
返回
$this
另请参见
bind() ¶ public
bind(string|int $param, mixed $value, string|int|null $type = null): $this
将查询占位符与值和类型关联起来。
$query->bind(':id', 1, 'integer');
参数
-
string|int
$param 要替换为 $value 的引用版本的占位符
-
mixed
$value 要绑定的值
-
string|int|null
$type 可选 映射的类型名称,用于在发送到数据库时进行强制转换
返回
$this
cache() ¶ public
cache(Closure|string|false $key, Psr\SimpleCache\CacheInterface|string $config = 'default'): $this
为此查询启用结果缓存。
如果查询启用了缓存,它在执行时将执行以下操作
- 检查 $key 的缓存。 如果有结果,将不会执行任何 SQL。 相反,将返回缓存的结果。
- 当缓存数据陈旧/丢失时,结果集将被缓存为查询执行。
用法
// Simple string key + config
$query->cache('my_key', 'db_results');
// Function to generate key.
$query->cache(function ($q) {
$key = serialize($q->clause('select'));
$key .= serialize($q->clause('where'));
return md5($key);
});
// Using a pre-built cache engine.
$query->cache('my_key', $engine);
// Disable caching
$query->cache(false);
参数
-
Closure|string|false
$key 缓存键或生成缓存键的函数。 使用函数时,将提供此查询实例作为参数。
-
Psr\SimpleCache\CacheInterface|string
$config 可选 要使用的缓存配置名称,或缓存引擎实例。
返回
$this
clause() ¶ public
clause(string $name): mixed
返回存储在指定子句中的任何数据。 这对于修改查询的任何内部部分很有用,并且 SQL 方言使用它在查询执行之前相应地转换查询。 可以检索的有效子句是:delete、update、set、insert、values、select、distinct、from、join、set、where、group、having、order、limit、offset、union 和 intersect。
这些部分的返回值可能会有所不同。 一些子句使用 QueryExpression 来内部存储其状态,一些子句使用数组,另一些子句可能使用布尔值或整数。 以下是每个子句的返回类型摘要。
- update: string 要更新的表的名称
- set: QueryExpression
- insert: array,将返回一个包含表 + 列的数组。
- values: ValuesExpression
- select: array,当未设置字段时将返回空数组
- distinct: boolean
- from: 表数组
- join: array
- set: array
- where: QueryExpression,当未设置时返回 null
- group: array
- having: QueryExpression,未设置时返回 null
- order: OrderByExpression,未设置时返回 null
- limit: 整数或 QueryExpression,未设置时为 null
- offset: 整数或 QueryExpression,未设置时为 null
- union: 数组
- intersect: 数组
参数
-
string
$name 要返回的子句的名称
返回
混合
抛出
InvalidArgumentException
当命名子句不存在时。
cleanCopy() ¶ public
cleanCopy(): static
创建当前查询的副本,触发 beforeFind 并重置一些状态。
以下状态将被清除
- autoFields
- limit
- offset
- map/reduce 函数
- 结果格式化程序
- order
- 包含
此方法创建查询克隆,在处理子查询时很有用。
返回
static
comment() ¶ public
comment(string|null $expression = null): $this
一个字符串或表达式,将作为注释附加到生成的查询。
示例
$query->select('id')->where(['author_id' => 1])->comment('Filter for admin user');
注释内容是原始 SQL,不适合用于用户提供的數據。
参数
-
string|null
$expression 可选 要添加的注释
返回
$this
contain() ¶ public
contain(array|string $associations, Closure|bool $override = false): $this
设置应该与该查询一起急切加载的关联列表。 传递的关联表列表必须使用 Table API 之前已设置为关联。
示例
// Bring articles' author information
$query->contain('Author');
// Also bring the category and tags associated to each article
$query->contain(['Category', 'Tag']);
可以使用点符号或嵌套数组任意嵌套关联,这允许此对象计算连接或必须执行的任何其他查询以获取所需的关联数据。
示例
// Eager load the product info, and for each product load other 2 associations
$query->contain(['Product' => ['Manufacturer', 'Distributor']);
// Which is equivalent to calling
$query->contain(['Products.Manufactures', 'Products.Distributors']);
// For an author query, load his region, state and country
$query->contain('Regions.States.Countries');
可以控制每个包含关联的条件和选定的字段
示例
$query->contain(['Tags' => function ($q) {
return $q->where(['Tags.is_popular' => true]);
}]);
$query->contain(['Products.Manufactures' => function ($q) {
return $q->select(['name'])->where(['Manufactures.active' => true]);
}]);
每个关联在渴望加载时可能会定义特殊选项,允许针对每个关联设置的选项是
foreignKey
:用于设置不同的字段以匹配两个表,如果设置为 false,将不会自动生成连接条件。false
只能用于可连接的关联,不能与 hasMany 或 belongsToMany 关联一起使用。fields
:包含应从关联中获取的字段的数组。finder
:在加载关联记录时使用的查找器。查找器的名称作为一个字符串,或者一个数组定义要传递给查找器的选项。queryBuilder
:等同于传递回调而不是选项数组。
示例
// Set options for the hasMany articles that will be eagerly loaded for an author
$query->contain([
'Articles' => [
'fields' => ['title', 'author_id']
]
]);
查找器可以配置为使用选项。
// Retrieve translations for the articles, but only those for the `en` and `es` locales
$query->contain([
'Articles' => [
'finder' => [
'translations' => [
'locales' => ['en', 'es']
]
]
]
]);
包含关联时,务必包含外键列。否则将触发异常。
// Use a query builder to add conditions to the containment
$query->contain('Authors', function ($q) {
return $q->where(...); // add conditions
});
// Use special join conditions for multiple containments in the same method call
$query->contain([
'Authors' => [
'foreignKey' => false,
'queryBuilder' => function ($q) {
return $q->where(...); // Add full filtering conditions
}
],
'Tags' => function ($q) {
return $q->where(...); // add conditions
}
]);
如果使用空第一个参数调用,并且 $override
设置为 true,则先前列表将被清空。
参数
-
array|string
$associations 要查询的表别名列表。
-
Closure|bool
$override 可选 关联的查询生成器,或者如果关联是一个数组,则是一个布尔值,表示是否用传递的值覆盖之前的列表,默认为将之前的列表与新的列表合并。
返回
$this
counter() ¶ public
counter(Closure|null $counter): $this
注册一个回调,它将在该查询中的 count
方法被调用时执行。 函数的返回值将被设置为 count
方法的返回值。
这在需要优化查询以返回计数时特别有用,例如删除不必要的连接,删除分组或只返回估计的行数。
回调将以该查询的克隆作为第一个参数接收,而不是该查询本身。
如果第一个参数为空值,则将调用内置计数函数
参数
-
Closure|null
$counter 计数器值
返回
$this
decorateResults() ¶ public
decorateResults(Closure|null $callback, bool $overwrite = false): $this
注册一个回调,该回调将在从结果集中获取每个结果时执行,回调函数将接收第一个参数,该参数是一个数组,其中包含来自数据库的原始数据,用于获取的每一行,并且必须返回该行,并带有任何可能的修改。
回调将延迟执行,如果只为数据库获取了 3 行,则将调用 3 次,即使光标中可能还有更多行要获取。
回调按注册顺序堆叠,如果要重置堆栈,请使用第二个参数设置为 true 调用此函数。
如果要从堆栈中删除所有装饰器,请将第一个参数设置为 null,并将第二个参数设置为 true。
示例
$query->decorateResults(function ($row) {
$row['order_total'] = $row['subtotal'] + ($row['subtotal'] * $row['tax']);
return $row;
});
参数
-
Closure|null
$callback 在获取结果时调用的回调。
-
bool
$overwrite 可选 这是否应该追加或替换所有现有的装饰器。
返回
$this
disableBufferedResults() ¶ public
disableBufferedResults(): $this
禁用缓冲结果。
禁用缓冲将减少内存消耗,因为获取的结果不会为将来的迭代而保留。
返回
$this
disableResultsCasting() ¶ public
disableResultsCasting(): $this
禁用结果转换。
禁用后,字段将按从数据库驱动程序接收到的方式返回(在大多数环境中,这意味着它们作为字符串返回),这可以提高大型数据集的性能。
返回
$this
distinct() ¶ public
distinct(Cake\Database\ExpressionInterface|array|string|bool $on = [], bool $overwrite = false): $this
在查询中添加 DISTINCT
子句以从结果集中删除重复项。 此子句只能用于 select 语句。
如果希望根据共享特定字段或一组字段的行来过滤重复项,可以传递一个要过滤的字段数组。注意,此选项可能不会在所有数据库系统中完全支持。
示例
// Filters products with the same name and city
$query->select(['name', 'city'])->from('products')->distinct();
// Filters products in the same city
$query->distinct(['city']);
$query->distinct('city');
// Filter products with the same name
$query->distinct(['name'], true);
$query->distinct('name', true);
参数
-
Cake\Database\ExpressionInterface|array|string|bool
$on 可选 启用/禁用不同的类或要过滤的字段列表
-
bool
$overwrite 可选 是否用传递的列表重置字段
返回
$this
eagerLoaded() ¶ public
eagerLoaded(bool $value): $this
将查询实例设置为急切加载的查询。 如果没有传递参数,则返回当前配置的查询 _eagerLoaded
值。
参数
-
bool
$value 是否渴望加载。
返回
$this
enableAutoFields() ¶ public
enableAutoFields(bool $value = true): $this
设置 ORM 是否应该自动追加字段。
默认情况下,调用 select() 将禁用自动字段。可以使用此方法重新启用自动字段。
参数
-
bool
$value 可选 设置为 true 以启用,设置为 false 以禁用。
返回
$this
enableBufferedResults() ¶ public
enableBufferedResults(): $this
启用缓冲结果。
启用后,此查询返回的结果将被缓冲。这使您能够多次迭代结果集,或者缓存和迭代它。
禁用后,它将减少内存消耗,因为获取的结果不会为将来的迭代而保留。
返回
$this
enableHydration() ¶ public
enableHydration(bool $enable = true): $this
切换水化实体。
如果设置为 false,则查询将返回数组结果。
参数
-
bool
$enable 可选 使用布尔值设置水化模式。
返回
$this
enableResultsCasting() ¶ public
enableResultsCasting(): $this
启用结果转换。
启用后,此查询返回的结果中的字段将转换为相应的 PHP 数据类型。
返回
$this
epilog() ¶ public
epilog(Cake\Database\ExpressionInterface|string|null $expression = null): $this
一个字符串或表达式,将附加到生成的查询。
示例
$query->select('id')->where(['author_id' => 1])->epilog('FOR UPDATE');
$query
->insert('articles', ['title'])
->values(['author_id' => 1])
->epilog('RETURNING id');
Epliog 内容是原始 SQL,不适合用于用户提供的數據。
参数
-
Cake\Database\ExpressionInterface|string|null
$expression 可选 要追加的表达式
返回
$this
execute() ¶ public
execute(): Cake\Database\StatementInterface
编译此查询的 SQL 表示形式,并使用配置的连接对象执行它。 返回结果语句对象。
在内部执行查询将执行几个步骤,第一步是让连接转换此对象以适应其特定的方言,这可能会导致生成不同的查询对象,该对象将是实际执行的对象。紧随其后,文字值被传递给连接,以便以安全的方式将它们绑定到查询。最后,生成的语句用自定义对象装饰,以根据需要为检索的每一行执行回调。
生成的语句是可遍历的,因此它可以在任何循环中使用,就像使用数组一样。
此方法可以在查询子类中被覆盖,以装饰查询执行周围的行为。
返回
Cake\Database\StatementInterface
expr() ¶ public
expr(Cake\Database\ExpressionInterface|array|string|null $rawExpression = null): Cake\Database\Expression\QueryExpression
返回一个新的 QueryExpression 对象。 当使用流畅的接口构建复杂查询时,这是一个方便的函数。 您也可以在子类中覆盖此函数,以在需要时使用更专业的 QueryExpression 类。
您可以选择传递一个原始 SQL 字符串,或者是一个数组或表达式,这些表达式可以被 \Cake\Database\Expression\QueryExpression 接受。
$expression = $query->expr(); // Returns an empty expression object
$expression = $query->expr('Table.column = Table2.column'); // Return a raw SQL expression
参数
-
Cake\Database\ExpressionInterface|array|string|null
$rawExpression 可选 字符串、数组或任何您想包装在表达式对象中的内容
返回
Cake\Database\Expression\QueryExpression
find() ¶ public
find(string $finder, mixed ...$args): static<TSubject>
对现有的查询对象应用自定义查找。
允许自定义查找方法相互组合并应用于彼此。
$repository->find('all')->find('recent');
以上是一个将多个查找器方法堆叠到单个查询中的示例。
参数
-
string
$finder 要使用的查找器方法。
-
mixed
...$args 与查找器特定参数匹配的参数
返回
static<TSubject>
first() ¶ public
first(): mixed
返回执行此查询的第一个结果,如果该查询之前没有执行过,则出于性能原因,它会将 limit 子句设置为 1。
示例
$singleUser = $query->select(['id', 'username'])->first();
返回
混合
firstOrFail() ¶ public
firstOrFail(): mixed
从执行查询中获取第一个结果或引发异常。
返回
混合
抛出
Cake\Datasource\Exception\RecordNotFoundException
当没有第一条记录时。
formatResults() ¶ public
formatResults(Closure|null $formatter = null, int|bool $mode = self::APPEND): $this
注册一个新的格式化回调函数,该函数将在尝试从数据库中获取结果时执行。
如果第二个参数设置为 true,它将擦除以前的格式化器并用传递的第一个参数替换它们。
回调需要返回一个迭代器对象,该对象将用作此查询结果的返回值。格式化器函数在执行此查询的所有 MapReduce
例程之后应用。
格式化回调将接收两个参数,第一个参数是一个实现 \Cake\Collection\CollectionInterface
的对象,可以随意遍历和修改。第二个参数是正在应用格式化器回调的查询实例。
通常,格式化器回调接收到的查询实例与回调所附加的相同查询实例相同,但在关联联接中除外,在这种情况下,回调将在关联源端查询上调用,并且它将接收该查询实例而不是最初附加回调的实例 - 请参见下面的示例!
示例
返回表中按 id 索引的所有结果
$query->select(['id', 'name'])->formatResults(function ($results) {
return $results->indexBy('id');
});
向 ResultSet 添加新列
$query->select(['name', 'birth_date'])->formatResults(function ($results) {
return $results->map(function ($row) {
$row['age'] = $row['birth_date']->diff(new DateTime)->y;
return $row;
});
});
根据查询的 hydration 配置向结果添加新列
$query->formatResults(function ($results, $query) {
return $results->map(function ($row) use ($query) {
$data = [
'bar' => 'baz',
];
if ($query->isHydrationEnabled()) {
$row['foo'] = new Foo($data)
} else {
$row['foo'] = $data;
}
return $row;
});
});
通过继承 contain 回调的查询参数,保留对联接关联的关联目标查询实例的访问权限
// Assuming a `Articles belongsTo Authors` association that uses the join strategy
$articlesQuery->contain('Authors', function ($authorsQuery) {
return $authorsQuery->formatResults(function ($results, $query) use ($authorsQuery) {
// Here `$authorsQuery` will always be the instance
// where the callback was attached to.
// The instance passed to the callback in the second
// argument (`$query`), will be the one where the
// callback is actually being applied to, in this
// example that would be `$articlesQuery`.
// ...
return $results;
});
});
参数
-
Closure|null
$formatter 可选 格式化函数
-
int|bool
$mode 可选 是否覆盖、追加或预先添加格式化器。
返回
$this
抛出
InvalidArgumentException
from() ¶ public
from(array|string $tables = [], bool $overwrite = false): $this
添加一个或多个表,这些表将在此查询的 FROM 子句中使用。 表可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
如果传递了一个数组,键将用于使用值作为要别名的真实字段来别名表。可以别名字符串、ExpressionInterface 对象,甚至其他 Query 对象。
默认情况下,此函数将把任何传递的参数追加到要从中选择的表的列表中,除非第二个参数设置为 true。
此方法可用于 select、update 和 delete 语句。
示例
$query->from(['p' => 'posts']); // Produces FROM posts p
$query->from('authors'); // Appends authors: FROM posts p, authors
$query->from(['products'], true); // Resets the list: FROM products
$query->from(['sub' => $countQuery]); // FROM (SELECT ...) sub
参数
-
array|string
$tables 可选 要添加到列表中的表。此参数可以作为字符串数组、表达式对象数组或单个字符串传递。请参见上面的示例以了解有效的调用类型。
-
bool
$overwrite 可选 是否使用传递的列表重置表
返回
$this
func() ¶ public
func(): Cake\Database\FunctionsBuilder
返回一个函数构建器对象的实例,该对象可用于生成任意 SQL 函数。
示例
$query->func()->count('*');
$query->func()->dateDiff(['2012-01-05', '2012-01-02'])
返回
Cake\Database\FunctionsBuilder
getConnection() ¶ public
getConnection(): Cake\Database\Connection
获取用于执行和转换此查询的连接实例。
返回
Cake\Database\Connection
getDefaultTypes() ¶ public
getDefaultTypes(): array<int|string, string>
获取当前类型图的默认类型。
返回
array<int|string, string>
getIterator() ¶ public
getIterator(): Cake\Datasource\ResultSetInterfaceCake\Datasource\EntityInterface|array>
执行此查询并返回结果迭代器。 此函数是实现 IteratorAggregate 接口所必需的,它允许迭代查询,而无需手动调用 execute(),从而使查询看起来像结果集而不是查询本身。
返回
Cake\Datasource\ResultSetInterfaceCake\Datasource\EntityInterface|array>
getOptions() ¶ public
getOptions(): array
返回一个包含应用于此查询的自定义选项的数组,这些选项尚未由该类的其他方法处理。
示例
$query->applyOptions(['doABarrelRoll' => true, 'fields' => ['id', 'name']);
$query->getOptions(); // Returns ['doABarrelRoll' => true]
返回
array
另请参见
applyOptions()
getRepository() ¶ public
getRepository(): Cake\ORM\Table
返回此查询将使用的默认存储库对象,即将在 from 子句中出现的表。
返回
Cake\ORM\Table
getResultFormatters() ¶ public
getResultFormatters(): arrayClosure>
返回先前注册的格式例程的列表。
返回
arrayClosure>
getSelectTypeMap() ¶ public
getSelectTypeMap(): Cake\Database\TypeMap
获取 TypeMap 类,其中存储了 select 子句中每个字段的类型。
返回
Cake\Database\TypeMap
getValueBinder() ¶ public
getValueBinder(): Cake\Database\ValueBinder
返回当前使用的 ValueBinder 实例。
ValueBinder 负责生成查询占位符,并将值暂时关联到这些占位符,以便可以将它们正确传递到语句对象。
返回
Cake\Database\ValueBinder
group() ¶ public
group(Cake\Database\ExpressionInterface|array|string $fields, bool $overwrite = false): $this
添加一个或多个字段,这些字段将在此查询的 GROUP BY 子句中使用。 字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
默认情况下,此函数将把任何传递的参数追加到要分组的字段列表中,除非第二个参数设置为 true。
示例
// Produces GROUP BY id, title
$query->groupBy(['id', 'title']);
// Produces GROUP BY title
$query->groupBy('title');
分组字段不适合与用户提供的数据一起使用,因为它们没有被查询构建器清理。
参数
-
Cake\Database\ExpressionInterface|array|string
$fields 要添加到列表中的字段
-
bool
$overwrite 可选 是否用传递的列表重置字段
返回
$this
groupBy() ¶ public
groupBy(Cake\Database\ExpressionInterface|array|string $fields, bool $overwrite = false): $this
添加一个或多个字段,这些字段将在此查询的 GROUP BY 子句中使用。 字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
默认情况下,此函数将把任何传递的参数追加到要分组的字段列表中,除非第二个参数设置为 true。
示例
// Produces GROUP BY id, title
$query->groupBy(['id', 'title']);
// Produces GROUP BY title
$query->groupBy('title');
分组字段不适合与用户提供的数据一起使用,因为它们没有被查询构建器清理。
参数
-
Cake\Database\ExpressionInterface|array|string
$fields 要添加到列表中的字段
-
bool
$overwrite 可选 是否用传递的列表重置字段
返回
$this
having() ¶ public
having(Cake\Database\ExpressionInterfaceClosure|array|string|null $conditions = null, array<string, string> $types = [], bool $overwrite = false): $this
添加一个或多个条件,这些条件将在此查询的 HAVING
子句中使用。 此方法的操作方式与 where()
方法完全相同。 请参考其文档以了解如何使用每个参数。
Having 字段不适合与用户提供的数据一起使用,因为它们没有经过查询生成器的清理。
参数
-
Cake\Database\ExpressionInterfaceClosure|array|string|null
$conditions 可选 having 条件。
-
array<string, string>
$types 可选 用于将值绑定到查询的类型名称的关联数组
-
bool
$overwrite 可选 是否使用传递的列表重置条件
返回
$this
另请参见
identifier() ¶ public
identifier(string $identifier): Cake\Database\ExpressionInterface
创建一个引用标识符的表达式。 标识符用于引用字段名称,并允许 SQL 编译器应用引号或转义标识符。
该值按原样使用,您可能需要在标识符中使用别名或包含表引用。请勿使用此方法来注入 SQL 方法或逻辑语句。
示例
$query->newExpr()->lte('count', $query->identifier('total'));
参数
-
string
$identifier 表达式的标识符
返回
Cake\Database\ExpressionInterface
innerJoin() ¶ public
innerJoin(array<string, mixed>|string $table, Cake\Database\ExpressionInterfaceClosure|array|string $conditions = [], array<string, string> $types = []): $this
在查询中添加一个单独的 INNER JOIN
子句。
这是通过 join()
构建联接的简写方法。
此方法的参数与 leftJoin()
简写相同,请参考该方法的描述以了解更详细的信息。
参数
-
array<string, mixed>|string
$table 要连接的表
-
Cake\Database\ExpressionInterfaceClosure|array|string
$conditions 可选 用于连接的条件。
-
array<string, string>
$types 可选 与用于将值转换为相应数据库表示的条件关联的类型列表。
返回
$this
innerJoinWith() ¶ public
innerJoinWith(string $assoc, Closure|null $builder = null): $this
使用传递的关联表创建 INNER JOIN,同时保留最初为其设置的外键匹配和自定义条件。
此函数将添加 contain
图表中的条目。
示例
// Bring only articles that were tagged with 'cake'
$query->innerJoinWith('Tags', function ($q) {
return $q->where(['name' => 'cake']);
});
这将创建以下 SQL
SELECT Articles.*
FROM articles Articles
INNER JOIN tags Tags ON Tags.name = 'cake'
INNER JOIN articles_tags ArticlesTags ON ArticlesTags.tag_id = Tags.id
AND ArticlesTags.articles_id = Articles.id
此函数与 matching()
的工作原理相同,区别在于它不会从关联中选择任何字段。
参数
-
string
$assoc 要连接的关联
-
Closure|null
$builder optional 一个函数,它将接收一个预制的查询对象,该对象可用于添加自定义条件或选择一些字段
返回
$this
另请参见
intersect() ¶ public
intersect(Cake\Database\Query|string $query, bool $overwrite = false): $this
添加一个完整的查询,该查询将与该查询的 INTERSECT 运算符一起使用。 这用于将此查询的结果集与传递的查询将返回的结果集结合起来。 您可以通过使用不同的查询多次调用此方法来添加任意多个查询。
默认情况下,INTERSECT 运算符将删除重复行,如果您希望为所有查询包含所有行,请使用 intersectAll()。
示例
$intersect = (new SelectQuery($conn))->select(['id', 'title'])->from(['a' => 'articles']);
$query->select(['id', 'name'])->from(['d' => 'things'])->intersect($intersect);
将生成
SELECT id, name FROM things d INTERSECT SELECT id, title FROM articles a
参数
-
Cake\Database\Query|string
$query 将在 INTERSECT 运算符中使用的完整 SQL 查询
-
bool
$overwrite 可选 是否重置要操作的查询列表
返回
$this
intersectAll() ¶ public
intersectAll(Cake\Database\Query|string $query, bool $overwrite = false): $this
添加一个完整的查询,该查询将与该查询的 INTERSECT ALL 运算符一起使用。 这用于将此查询的结果集与传递的查询将返回的结果集结合起来。 您可以通过使用不同的查询多次调用此方法来添加任意多个查询。
与 INTERSECT 不同,INTERSECT ALL 不会删除重复行。
$intersect = (new SelectQuery($conn))->select(['id', 'title'])->from(['a' => 'articles']);
$query->select(['id', 'name'])->from(['d' => 'things'])->intersectAll($intersect);
将生成
SELECT id, name FROM things d INTERSECT ALL SELECT id, title FROM articles a
参数
-
Cake\Database\Query|string
$query 将在 INTERSECT 运算符中使用的完整 SQL 查询
-
bool
$overwrite 可选 是否重置要操作的查询列表
返回
$this
isAutoFieldsEnabled() ¶ public
isAutoFieldsEnabled(): bool|null
获取 ORM 是否应该自动追加字段。
默认情况下,调用 select() 将禁用自动字段。您可以使用 enableAutoFields() 重新启用自动字段。
返回
bool|null
isBufferedResultsEnabled() ¶ public
isBufferedResultsEnabled(): bool
返回是否启用/禁用缓冲结果。
启用后,此查询返回的结果将被缓冲。这使您能够多次迭代结果集,或者缓存和迭代它。
禁用后,它将减少内存消耗,因为获取的结果不会为将来的迭代而保留。
返回
bool
isResultsCastingEnabled() ¶ public
isResultsCastingEnabled(): bool
返回结果转换是否启用/禁用。
启用后,此查询返回的结果中的字段将转换为相应的 PHP 数据类型。
禁用后,字段将按从数据库驱动程序接收到的方式返回(在大多数环境中,这意味着它们作为字符串返回),这可以提高大型数据集的性能。
返回
bool
join() ¶ public
join(array<string, mixed>|string $tables, array<string, string> $types = [], bool $overwrite = false): $this
添加一个或多个表作为 JOIN 子句用于此查询。表可以作为字符串数组、描述连接部分的数组、包含多个连接描述的数组或单个字符串传递。
默认情况下,此函数会将任何传递的参数追加到要连接的表列表中,除非第三个参数设置为 true。
当没有指定连接类型时,默认情况下使用 INNER JOIN
:$query->join(['authors'])
将生成 INNER JOIN authors ON 1 = 1
也可以使用数组键对连接进行别名:$query->join(['a' => 'authors'])
将生成 INNER JOIN authors a ON 1 = 1
可以使用数组表示法来完全描述和别名连接
$query->join([
'a' => [
'table' => 'authors',
'type' => 'LEFT',
'conditions' => 'a.id = b.author_id'
]
]);
// Produces LEFT JOIN authors a ON a.id = b.author_id
您甚至可以在数组中指定多个连接,包括完整描述
$query->join([
'a' => [
'table' => 'authors',
'type' => 'LEFT',
'conditions' => 'a.id = b.author_id'
],
'p' => [
'table' => 'publishers',
'type' => 'INNER',
'conditions' => 'p.id = b.publisher_id AND p.name = "Cake Software Foundation"'
]
]);
// LEFT JOIN authors a ON a.id = b.author_id
// INNER JOIN publishers p ON p.id = b.publisher_id AND p.name = "Cake Software Foundation"
使用条件和类型
条件可以使用字符串表示(用于比较列),或使用包含已引用文字值的字符串表示。此外,可以使用用数组或表达式对象表示的条件。
当使用数组来表达条件时,通常希望将文字值转换为正确的数据库表示形式。这可以通过使用此函数的第二个参数来实现。
$query->join(['a' => [
'table' => 'articles',
'conditions' => [
'a.posted >=' => new DateTime('-3 days'),
'a.published' => true,
'a.author_id = authors.id'
]
]], ['a.posted' => 'datetime', 'a.published' => 'boolean'])
覆盖连接
当使用数组表示法创建别名连接时,您可以通过在后续对该函数的调用中使用相同的别名来覆盖之前的连接定义,或者如果此函数的第三个参数设置为 true,则可以使用另一个列表替换所有先前定义的连接。
$query->join(['alias' => 'table']); // joins table with as alias
$query->join(['alias' => 'another_table']); // joins another_table with as alias
$query->join(['something' => 'different_table'], [], true); // resets joins list
参数
-
array<string, mixed>|string
$tables 要连接到查询中的表列表
-
array<string, string>
$types 可选 用于将值绑定到查询的类型名称的关联数组
-
bool
$overwrite 可选 是否使用传递的列表重置连接
返回
$this
另请参见
jsonSerialize() ¶ public
jsonSerialize(): Cake\Datasource\ResultSetInterfaceCake\Datasource\EntityInterface|mixed>
执行查询并将结果集转换为 JSON。
JsonSerializable 接口的一部分。
返回
Cake\Datasource\ResultSetInterfaceCake\Datasource\EntityInterface|mixed>
leftJoin() ¶ public
leftJoin(array<string, mixed>|string $table, Cake\Database\ExpressionInterfaceClosure|array|string $conditions = [], array $types = []): $this
向查询添加一个 LEFT JOIN
子句。
这是通过 join()
构建联接的简写方法。
表名可以作为字符串传递,也可以作为数组传递(如果需要为其创建别名)
// LEFT JOIN authors ON authors.id = posts.author_id
$query->leftJoin('authors', 'authors.id = posts.author_id');
// LEFT JOIN authors a ON a.id = posts.author_id
$query->leftJoin(['a' => 'authors'], 'a.id = posts.author_id');
条件可以作为字符串、数组或表达式对象传递。当使用数组时,可以将其与 $types
参数结合使用来定义如何转换值
$query->leftJoin(['a' => 'articles'], [
'a.posted >=' => new DateTime('-3 days'),
'a.published' => true,
'a.author_id = authors.id'
], ['a.posted' => 'datetime', 'a.published' => 'boolean']);
有关条件和类型的更多详细信息,请参阅 join()
。
参数
-
array<string, mixed>|string
$table 要连接的表
-
Cake\Database\ExpressionInterfaceClosure|array|string
$conditions 可选 用于连接的条件。
-
array
$types 可选 与用于将值转换为相应数据库表示的条件关联的类型列表。
返回
$this
leftJoinWith() ¶ public
leftJoinWith(string $assoc, Closure|null $builder = null): $this
使用传递的关联表创建一个 LEFT JOIN,同时保留外键匹配以及最初为其设置的自定义条件。
此函数将添加 contain
图表中的条目。
示例
// Get the count of articles per user
$usersQuery
->select(['total_articles' => $query->func()->count('Articles.id')])
->leftJoinWith('Articles')
->groupBy(['Users.id'])
->enableAutoFields();
您还可以自定义传递给 LEFT JOIN 的条件
// Get the count of articles per user with at least 5 votes
$usersQuery
->select(['total_articles' => $query->func()->count('Articles.id')])
->leftJoinWith('Articles', function ($q) {
return $q->where(['Articles.votes >=' => 5]);
})
->groupBy(['Users.id'])
->enableAutoFields();
这将创建以下 SQL
SELECT COUNT(Articles.id) AS total_articles, Users.*
FROM users Users
LEFT JOIN articles Articles ON Articles.user_id = Users.id AND Articles.votes >= 5
GROUP BY USers.id
可以使用点表示法对深度关联进行左连接
示例
// Total comments in articles by 'markstory'
$query
->select(['total_comments' => $query->func()->count('Comments.id')])
->leftJoinWith('Comments.Users', function ($q) {
return $q->where(['username' => 'markstory']);
})
->groupBy(['Users.id']);
请注意,传递给闭包的查询只接受在其上调用 select
、where
、andWhere
和 orWhere
。如果要添加更复杂的子句,可以在主查询中直接进行。
参数
-
string
$assoc 要连接的关联
-
Closure|null
$builder optional 一个函数,它将接收一个预制的查询对象,该对象可用于添加自定义条件或选择一些字段
返回
$this
limit() ¶ public
limit(int|null $limit): $this
设置应从数据库中检索的记录数量,接受整数或计算结果为整数的表达式对象。在某些数据库中,此操作可能不受支持,或者需要转换查询才能限制结果集的大小。
示例
$query->limit(10) // generates LIMIT 10
$query->limit($query->newExpr()->add(['1 + 1'])); // LIMIT (1 + 1)
参数
-
int|null
$limit 要返回的记录数
返回
$this
mapReduce() ¶ public
mapReduce(Closure|null $mapper = null, Closure|null $reducer = null, bool $overwrite = false): $this
注册一个新的 MapReduce 例程,该例程将在数据库结果之上执行。
MapReduce 路由只会在执行查询并尝试获取第一个结果时运行。
如果第三个参数设置为 true,它将擦除之前的 map reducers 并将其替换为传递的参数。
参数
-
Closure|null
$mapper optional 映射器函数
-
Closure|null
$reducer optional 缩减函数
-
bool
$overwrite 可选 设置为 true 以覆盖现有的 map + reduce 函数。
返回
$this
另请参见
matching() ¶ public
matching(string $assoc, Closure|null $builder = null): $this
向此查询添加过滤条件,以仅获取与关联表中的另一行具有关系的行,这些关系基于关联表中的条件。
此函数将添加 contain
图表中的条目。
示例
// Bring only articles that were tagged with 'cake'
$query->matching('Tags', function ($q) {
return $q->where(['name' => 'cake']);
});
可以使用点表示法对深度关联进行筛选
示例
// Bring only articles that were commented by 'markstory'
$query->matching('Comments.Users', function ($q) {
return $q->where(['username' => 'markstory']);
});
由于此函数将创建 INNER JOIN
,因此您可能需要考虑在此查询上调用 distinct
,因为如果您的条件没有筛选它们,您可能会获得重复的行。例如,这可能是同一个用户在同一篇文章中评论多次的情况。
示例
// Bring unique articles that were commented by 'markstory'
$query->distinct(['Articles.id'])
->matching('Comments.Users', function ($q) {
return $q->where(['username' => 'markstory']);
});
请注意,传递给闭包的查询只接受在其上调用 select
、where
、andWhere
和 orWhere
。如果要添加更复杂的子句,可以在主查询中直接进行。
参数
-
string
$assoc 要筛选的关联
-
Closure|null
$builder optional 一个函数,它将接收一个预制的查询对象,该对象可用于添加自定义条件或选择一些字段
返回
$this
modifier() ¶ public
modifier(Cake\Database\ExpressionInterface|array|string $modifiers, bool $overwrite = false): $this
添加一个或多个 SELECT
修饰符,用于 SELECT
中。
默认情况下,此函数会将任何传递的参数追加到要应用的修饰符列表中,除非第二个参数设置为 true。
示例
// Ignore cache query in MySQL
$query->select(['name', 'city'])->from('products')->modifier('SQL_NO_CACHE');
// It will produce the SQL: SELECT SQL_NO_CACHE name, city FROM products
// Or with multiple modifiers
$query->select(['name', 'city'])->from('products')->modifier(['HIGH_PRIORITY', 'SQL_NO_CACHE']);
// It will produce the SQL: SELECT HIGH_PRIORITY SQL_NO_CACHE name, city FROM products
参数
-
Cake\Database\ExpressionInterface|array|string
$modifiers 要应用于查询的修饰符
-
bool
$overwrite 可选 是否使用字段列表重置顺序
返回
$this
newExpr() ¶ public
newExpr(Cake\Database\ExpressionInterface|array|string|null $rawExpression = null): Cake\Database\Expression\QueryExpression
返回一个新的 QueryExpression 对象。 当使用流畅的接口构建复杂查询时,这是一个方便的函数。 您也可以在子类中覆盖此函数,以在需要时使用更专业的 QueryExpression 类。
您可以选择传递一个原始 SQL 字符串,或者是一个数组或表达式,这些表达式可以被 \Cake\Database\Expression\QueryExpression 接受。
$expression = $query->expr(); // Returns an empty expression object
$expression = $query->expr('Table.column = Table2.column'); // Return a raw SQL expression
参数
-
Cake\Database\ExpressionInterface|array|string|null
$rawExpression 可选 字符串、数组或任何您想包装在表达式对象中的内容
返回
Cake\Database\Expression\QueryExpression
notMatching() ¶ public
notMatching(string $assoc, Closure|null $builder = null): $this
向此查询添加过滤条件,以仅获取与关联表中的另一行没有匹配的行,这些关系基于关联表中的条件。
此函数将添加 contain
图表中的条目。
示例
// Bring only articles that were not tagged with 'cake'
$query->notMatching('Tags', function ($q) {
return $q->where(['name' => 'cake']);
});
可以使用点表示法对深度关联进行筛选
示例
// Bring only articles that weren't commented by 'markstory'
$query->notMatching('Comments.Users', function ($q) {
return $q->where(['username' => 'markstory']);
});
由于此函数将创建 LEFT JOIN
,因此您可能需要考虑在此查询上调用 distinct
,因为如果您的条件没有筛选它们,您可能会获得重复的行。例如,这可能是同一篇文章有多个评论的情况。
示例
// Bring unique articles that were commented by 'markstory'
$query->distinct(['Articles.id'])
->notMatching('Comments.Users', function ($q) {
return $q->where(['username' => 'markstory']);
});
请注意,传递给闭包的查询只接受在其上调用 select
、where
、andWhere
和 orWhere
。如果要添加更复杂的子句,可以在主查询中直接进行。
参数
-
string
$assoc 要筛选的关联
-
Closure|null
$builder optional 一个函数,它将接收一个预制的查询对象,该对象可用于添加自定义条件或选择一些字段
返回
$this
offset() ¶ public
offset(int|null $offset): $this
设置应从原始结果集中跳过的记录数量。这通常用于对大型结果进行分页。接受整数或计算结果为整数的表达式对象。
在某些数据库中,此操作可能不受支持,或者需要转换查询才能限制结果集的大小。
示例
$query->offset(10) // generates OFFSET 10
$query->offset($query->newExpr()->add(['1 + 1'])); // OFFSET (1 + 1)
参数
-
int|null
$offset 要跳过的记录数
返回
$this
order() ¶ public
order(Closure|array|string $fields, bool $overwrite = false): $this
添加一个或多个字段,用于此查询的 ORDER 子句中。字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
如果传递的是数组,键将用作字段本身,而值将表示该字段应排序的顺序。如果多次使用相同的字段作为键调用,则最后一次排序定义将优先于其他定义。
默认情况下,此函数会将任何传递的参数追加到要选择的字段列表中,除非第二个参数设置为 true。
示例
$query->orderBy(['title' => 'DESC', 'author_id' => 'ASC']);
产生
ORDER BY title DESC, author_id ASC
$query
->orderBy(['title' => $query->newExpr('DESC NULLS FIRST')])
->orderBy('author_id');
将生成
ORDER BY title DESC NULLS FIRST, author_id
$expression = $query->newExpr()->add(['id % 2 = 0']);
$query->orderBy($expression)->orderBy(['title' => 'ASC']);
将变成
ORDER BY (id %2 = 0), title ASC
如果需要将复杂表达式设置为排序条件,则应使用 orderByAsc()
或 orderByDesc()
。
参数
-
Closure|array|string
$fields 要添加到列表中的字段
-
bool
$overwrite 可选 是否使用字段列表重置顺序
返回
$this
orderAsc() ¶ public
orderAsc(Cake\Database\ExpressionInterfaceClosure|string $field, bool $overwrite = false): $this
添加具有 ASC 方向的 ORDER BY 子句。
此方法允许您设置复杂的表达式作为排序条件,不同于 order()
排序字段不适合用于用户提供的数据,因为它们不会被查询构建器清理。
参数
-
Cake\Database\ExpressionInterfaceClosure|string
$field 要排序的字段。
-
bool
$overwrite 可选 是否重置排序子句。
返回
$this
orderBy() ¶ public
orderBy(Closure|array|string $fields, bool $overwrite = false): $this
添加一个或多个字段,用于此查询的 ORDER 子句中。字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
如果传递的是数组,键将用作字段本身,而值将表示该字段应排序的顺序。如果多次使用相同的字段作为键调用,则最后一次排序定义将优先于其他定义。
默认情况下,此函数会将任何传递的参数追加到要选择的字段列表中,除非第二个参数设置为 true。
示例
$query->orderBy(['title' => 'DESC', 'author_id' => 'ASC']);
产生
ORDER BY title DESC, author_id ASC
$query
->orderBy(['title' => $query->newExpr('DESC NULLS FIRST')])
->orderBy('author_id');
将生成
ORDER BY title DESC NULLS FIRST, author_id
$expression = $query->newExpr()->add(['id % 2 = 0']);
$query->orderBy($expression)->orderBy(['title' => 'ASC']);
将变成
ORDER BY (id %2 = 0), title ASC
如果需要将复杂表达式设置为排序条件,则应使用 orderByAsc()
或 orderByDesc()
。
参数
-
Closure|array|string
$fields 要添加到列表中的字段
-
bool
$overwrite 可选 是否使用字段列表重置顺序
返回
$this
orderByAsc() ¶ public
orderByAsc(Cake\Database\ExpressionInterfaceClosure|string $field, bool $overwrite = false): $this
添加具有 ASC 方向的 ORDER BY 子句。
此方法允许您设置复杂的表达式作为排序条件,不同于 order()
排序字段不适合用于用户提供的数据,因为它们不会被查询构建器清理。
参数
-
Cake\Database\ExpressionInterfaceClosure|string
$field 要排序的字段。
-
bool
$overwrite 可选 是否重置排序子句。
返回
$this
orderByDesc() ¶ public
orderByDesc(Cake\Database\ExpressionInterfaceClosure|string $field, bool $overwrite = false): $this
添加具有 DESC 方向的 ORDER BY 子句。
此方法允许您设置复杂的表达式作为排序条件,不同于 order()
排序字段不适合用于用户提供的数据,因为它们不会被查询构建器清理。
参数
-
Cake\Database\ExpressionInterfaceClosure|string
$field 要排序的字段。
-
bool
$overwrite 可选 是否重置排序子句。
返回
$this
orderDesc() ¶ public
orderDesc(Cake\Database\ExpressionInterfaceClosure|string $field, bool $overwrite = false): $this
添加具有 DESC 方向的 ORDER BY 子句。
此方法允许您设置复杂的表达式作为排序条件,不同于 order()
排序字段不适合用于用户提供的数据,因为它们不会被查询构建器清理。
参数
-
Cake\Database\ExpressionInterfaceClosure|string
$field 要排序的字段。
-
bool
$overwrite 可选 是否重置排序子句。
返回
$this
page() ¶ public
page(int $num, int|null $limit = null): $this
设置所需的页面结果。
此方法提供了一个更易于使用的接口来设置您希望作为结果的记录集中限制 + 偏移量。如果为空,则限制将默认为现有的限制子句,如果该子句也为空,则使用 25
。
页面必须从 1 开始。
参数
-
int
$num 您想要的页码。
-
int|null
$limit 可选 您希望页面中显示的行数。如果为 null,则将使用当前的限制子句。
返回
$this
抛出
InvalidArgumentException
如果页码 < 1。
removeJoin() ¶ public
removeJoin(string $name): $this
如果已定义,则删除连接。
当您重新定义连接或希望重新排序连接子句时很有用。
参数
-
string
$name 要删除的连接的别名/名称。
返回
$this
resultSetFactory() ¶ public
resultSetFactory(): Cake\ORM\ResultSetFactory
获取结果集工厂。
返回
Cake\ORM\ResultSetFactory
rightJoin() ¶ public
rightJoin(array<string, mixed>|string $table, Cake\Database\ExpressionInterfaceClosure|array|string $conditions = [], array $types = []): $this
向查询添加一个 RIGHT JOIN
子句。
这是通过 join()
构建联接的简写方法。
此方法的参数与 leftJoin()
简写相同,请参阅该方法的描述以获取更多详细信息。
参数
-
array<string, mixed>|string
$table 要连接的表
-
Cake\Database\ExpressionInterfaceClosure|array|string
$conditions 可选 用于连接的条件。
-
array
$types 可选 与用于将值转换为相应数据库表示的条件关联的类型列表。
返回
$this
rowCountAndClose() ¶ public
rowCountAndClose(): int
执行此查询的 SQL,并在返回已更改记录的行数之前立即关闭语句。
此方法可用于 UPDATE 和 DELETE 查询,但不建议用于 SELECT 查询,也不用于计算记录数量。
示例
$rowCount = $query->update('articles')
->set(['published'=>true])
->where(['published'=>false])
->rowCountAndClose();
上面的示例将把所有为假的记录的 published 列更改为 true,并返回更新的记录数量。
返回
int
select() ¶ public
select(Cake\Database\ExpressionInterfaceCake\ORM\TableCake\ORM\AssociationClosure|array|string|float|int $fields = [], bool $overwrite = false): $this
添加要由 SELECT
语句返回的新字段,当执行此查询时。字段可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
如果传递的是数组,则键将用于使用值作为要别名的真实字段来别名字段。可以别名字符串、Expression 对象,甚至其他 Query 对象。
如果传递的是回调函数,则该函数返回的数组将用作字段列表。
默认情况下,此函数会将任何传递的参数追加到要选择的字段列表中,除非第二个参数设置为 true。
示例
$query->select(['id', 'title']); // Produces SELECT id, title
$query->select(['author' => 'author_id']); // Appends author: SELECT id, title, author_id as author
$query->select('id', true); // Resets the list: SELECT id
$query->select(['total' => $countQuery]); // SELECT id, (SELECT ...) AS total
$query->select(function ($query) {
return ['article_id', 'total' => $query->count('*')];
})
默认情况下,不会选择任何字段。如果您有一个 Cake\ORM\Query
实例,并且尝试追加字段,那么您还应该调用 Cake\ORM\Query::enableAutoFields()
来从表中选择默认字段。
如果您传递的是 Cake\ORM\Table
或 Cake\ORM\Association
类的实例,则表或关联的模式中的所有字段都将添加到 select 子句中。
参数
-
Cake\Database\ExpressionInterfaceCake\ORM\TableCake\ORM\AssociationClosure|array|string|float|int
$fields 可选 要添加到列表中的字段。
-
bool
$overwrite 可选 是否用传递的列表重置字段
返回
$this
selectAllExcept() ¶ public
selectAllExcept(Cake\ORM\TableCake\ORM\Association $table, list<string> $excludedFields, bool $overwrite = false): $this
除排除字段外,与传递的表关联的所有字段都将添加到查询的 select 子句中。传递的排除字段不应别名。在第一次调用此方法后,第二次调用不能用于删除已通过第一次调用添加到查询中的字段。如果您需要在第一次调用后更改列表,请传递覆盖布尔值 true,它将重置 select 子句,删除所有先前的添加。
参数
-
Cake\ORM\TableCake\ORM\Association
$table 要使用以获取列数组的表
-
list<string>
$excludedFields 您不希望从 $table 中选择的未别名的列名
-
bool
$overwrite 可选 是否重置/移除以前选择的字段
返回
$this
selectAlso() ¶ public
selectAlso(Cake\Database\ExpressionInterfaceCake\ORM\TableCake\ORM\AssociationClosure|array|string|float|int $fields): $this
行为与 select()
完全相同,除了将字段添加到选定字段列表中,并且不会禁用自动选择关联的字段。
使用此方法来代替调用 select()
然后 enableAutoFields()
来重新启用自动字段。
参数
-
Cake\Database\ExpressionInterfaceCake\ORM\TableCake\ORM\AssociationClosure|array|string|float|int
$fields 要添加到列表中的字段。
返回
$this
setConnection() ¶ public
setConnection(Cake\Database\Connection $connection): $this
设置用于执行和转换此查询的连接实例。
参数
-
Cake\Database\Connection
$connection 连接实例
返回
$this
setConnectionRole() ¶ public
setConnectionRole(string $role): $this
设置连接角色。
参数
-
string
$role 连接角色 ('read' 或 'write')
返回
$this
setDefaultTypes() ¶ public
setDefaultTypes(array<int|string, string> $types): $this
覆盖实现对象中字段的默认类型映射。
此方法在您需要设置跨多个查询函数/表达式共享的类型映射时很有用。
要添加默认值而不覆盖现有默认值,请使用 getTypeMap()->addDefaults()
参数
-
array<int|string, string>
$types 要设置的类型数组。
返回
$this
另请参见
setEagerLoader() ¶ public
setEagerLoader(Cake\ORM\EagerLoader $instance): $this
设置要用于加载关联和存储包含的渴望加载器类的实例。
参数
-
Cake\ORM\EagerLoader
$instance 要使用的急切加载器。
返回
$this
setRepository() ¶ public
setRepository(Cake\Datasource\RepositoryInterface $repository): $this
设置将由此查询使用并构成 FROM
子句的默认 Table 对象。
参数
-
Cake\Datasource\RepositoryInterface
$repository 要使用的默认表对象
返回
$this
setResult() ¶ public
setResult(iterable $results): $this
为查询设置结果集。
设置查询的结果集将使 execute() 成为一个无操作函数。它不会执行 SQL 查询并获取结果,而是返回为此方法提供的结果集。
此方法在与存储在持久缓存中的结果结合使用时最有用。
参数
-
iterable
$results 此查询应返回的结果。
返回
$this
setSelectTypeMap() ¶ public
setSelectTypeMap(Cake\Database\TypeMap|array $typeMap): $this
设置 TypeMap 类,其中存储 select 子句中每个字段的类型。
参数
-
Cake\Database\TypeMap|array
$typeMap 如果为数组,则创建 TypeMap,否则设置给定的 TypeMap。
返回
$this
setTypeMap() ¶ public
setTypeMap(Cake\Database\TypeMap|array $typeMap): $this
如果 $typeMap 是一个数组,则创建一个新的 TypeMap,否则将其替换为给定的 TypeMap。
参数
-
Cake\Database\TypeMap|array
$typeMap 如果为数组,则创建 TypeMap,否则设置给定的 TypeMap
返回
$this
setValueBinder() ¶ public
setValueBinder(Cake\Database\ValueBinder|null $binder): $this
覆盖当前值绑定器。
ValueBinder 负责生成查询占位符,并将值暂时关联到这些占位符,以便可以将它们正确传递到语句对象。
参数
-
Cake\Database\ValueBinder|null
$binder 绑定器或 null 以禁用绑定。
返回
$this
sql() ¶ public
sql(Cake\Database\ValueBinder|null $binder = null): string
返回此对象的 SQL 表示形式。
此函数将编译此查询以使其与连接使用的 SQL 方言兼容。此过程可能会添加、删除或更改任何查询部分或内部表达式以使其在目标平台上可执行。
生成的查询可能包含占位符,这些占位符将在查询执行时被替换为实际值,因此最适合与预处理语句一起使用。
参数
-
Cake\Database\ValueBinder|null
$binder 可选
返回
string
traverse() ¶ public
traverse(Closure $callback): $this
将迭代每个指定的部件。遍历函数可以使用闭包或实例变量中的变量聚合结果。此函数通常用作遍历所有将用于构建查询的查询部分的方法。
回调函数将接收 2 个参数,第一个参数是正在迭代的查询部分的值,第二个参数是该部分的名称。
示例
$query->select(['title'])->from('articles')->traverse(function ($value, $clause) {
if ($clause === 'select') {
var_dump($value);
}
});
参数
-
Closure
$callback 要为每个部分执行的回调函数
返回
$this
traverseExpressions() ¶ public
traverseExpressions(Closure $callback): $this
此函数的工作原理类似于 traverse() 函数,不同之处在于它对整个表达式树进行全深度遍历。这将对存储在此查询中的每个 ExpressionInterface 对象执行提供的回调函数,无论它在查询的任何部分的任何嵌套深度。
回调函数将接收当前访问的表达式作为第一个参数。
参数
-
Closure
$callback 此查询中找到的每个 ExpressionInterface 都会执行的函数。
返回
$this
traverseParts() ¶ public
traverseParts(Closure $visitor, list<string> $parts): $this
将迭代提供的部分。
遍历函数可以使用闭包中的变量或实例变量来聚合结果。此方法可以用于遍历查询部分的子集,以渲染 SQL 查询。
回调函数将接收 2 个参数,第一个参数是正在迭代的查询部分的值,第二个参数是该部分的名称。
示例
$query->select(['title'])->from('articles')->traverse(function ($value, $clause) {
if ($clause === 'select') {
var_dump($value);
}
}, ['select', 'from']);
参数
-
Closure
$visitor 每个部分执行的回调函数
-
list<string>
$parts 要遍历的查询部分列表
返回
$this
triggerBeforeFind() ¶ public
triggerBeforeFind(): void
在查询的存储库对象上触发 beforeFind 事件。
只会触发一次,并且只针对选择查询。
返回
void
union() ¶ public
union(Cake\Database\Query|string $query, bool $overwrite = false): $this
添加一个完整的查询,用于与此查询的 UNION 运算符一起使用。这用于将此查询的结果集与传递的查询返回的结果集相结合。您可以通过使用不同的查询多次调用此方法来添加所需的查询。
默认情况下,UNION 运算符将删除重复行,如果您希望包含所有查询中的每行,请使用 unionAll()。
示例
$union = (new SelectQuery($conn))->select(['id', 'title'])->from(['a' => 'articles']);
$query->select(['id', 'name'])->from(['d' => 'things'])->union($union);
将生成
SELECT id, name FROM things d UNION SELECT id, title FROM articles a
参数
-
Cake\Database\Query|string
$query 要在 UNION 运算符中使用的完整 SQL 查询
-
bool
$overwrite 可选 是否重置要操作的查询列表
返回
$this
unionAll() ¶ public
unionAll(Cake\Database\Query|string $query, bool $overwrite = false): $this
添加一个完整的查询,用于与此查询的 UNION ALL 运算符一起使用。这用于将此查询的结果集与传递的查询返回的结果集相结合。您可以通过使用不同的查询多次调用此方法来添加所需的查询。
与 UNION 不同,UNION ALL 不会删除重复行。
$union = (new SelectQuery($conn))->select(['id', 'title'])->from(['a' => 'articles']);
$query->select(['id', 'name'])->from(['d' => 'things'])->unionAll($union);
将生成
SELECT id, name FROM things d UNION ALL SELECT id, title FROM articles a
参数
-
Cake\Database\Query|string
$query 要在 UNION 运算符中使用的完整 SQL 查询
-
bool
$overwrite 可选 是否重置要操作的查询列表
返回
$this
where() ¶ public
where(Closure|array|string|null $conditions = null, array<string, string> $types = [], bool $overwrite = false): $this
添加一个条件或一组条件,用于此查询的 WHERE 子句中。条件可以表示为键为字段的数组,其中包含比较运算符,数组的值将用于将字段与该文字进行比较。最后,条件可以表示为单个字符串或字符串数组。
使用数组时,每个条目将使用 AND 运算符与其余条件连接起来。对该函数的连续调用也将使用 AND 运算符连接新指定的条件。此外,值可以使用表达式对象来表达,表达式对象可以包含其他查询对象。
使用此方法创建的任何条件都可以与任何 SELECT、UPDATE 和 DELETE 类型的查询一起使用。
使用运算符的条件
$query->where([
'posted >=' => new DateTime('3 days ago'),
'title LIKE' => 'Hello W%',
'author_id' => 1,
], ['posted' => 'datetime']);
前面的示例产生
WHERE posted >= 2012-01-27 AND title LIKE 'Hello W%' AND author_id = 1
第二个参数用于指定为每个传递的键期望的类型。有效类型可以使用 Database\Type 类映射的类型。
使用连接嵌套条件
$query->where([
'author_id !=' => 1,
'OR' => ['published' => true, 'posted <' => new DateTime('now')],
'NOT' => ['title' => 'Hello']
], ['published' => boolean, 'posted' => 'datetime']
前面的示例产生
WHERE author_id = 1 AND (published = 1 OR posted < '2012-02-01') AND NOT (title = 'Hello')
您可以使用连接随意嵌套条件。有时,您可能希望为同一个键定义 2 个不同的选项,在这种情况下,您可以将每个条件包装在一个新数组中
$query->where(['OR' => [['published' => false], ['published' => true]])
请记住,每次使用第三个参数设置为 false(默认值)调用 where() 时,它将使用 AND 运算符将传递的条件与之前存储的列表连接起来。此外,在对该方法的连续调用中使用相同的数组键两次不会覆盖先前的值。
使用表达式对象
$exp = $query->newExpr()->add(['id !=' => 100, 'author_id' != 1])->tieWith('OR');
$query->where(['published' => true], ['published' => 'boolean'])->where($exp);
前面的示例产生
WHERE (id != 100 OR author_id != 1) AND published = 1
可以作为任何字段条件使用的其他查询对象。
分步添加条件
您可以使用回调函数来构建复杂的表达式,函数接收一个新的 QueryExpression 对象作为第一个参数,并接收此查询实例作为第二个参数。函数必须返回一个表达式对象,该对象将使用 AND 运算符添加到查询的条件列表中。
$query
->where(['title !=' => 'Hello World'])
->where(function ($exp, $query) {
$or = $exp->or(['id' => 1]);
$and = $exp->and(['id >' => 2, 'id <' => 10]);
return $or->add($and);
});
- 前面的示例产生
WHERE title != 'Hello World' AND (id = 1 OR (id > 2 AND id < 10))
字符串条件
$query->where(['articles.author_id = authors.id', 'modified IS NULL']);
前面的示例产生
WHERE articles.author_id = authors.id AND modified IS NULL
请注意,使用数组表示法或表达式对象时,所有值将自动正确地引用并转换为相应的数据库数据类型,从而保护您的应用程序免受 SQL 注入。如果您使用字符串条件,请确保您的值已正确引用。最安全的方法是永远不要使用字符串条件。
参数
-
Closure|array|string|null
$conditions optional 要过滤的条件。
-
array<string, string>
$types 可选 用于将值绑定到查询的类型名称的关联数组
-
bool
$overwrite 可选 是否使用传递的列表重置条件
返回
$this
whereInList() ¶ public
whereInList(string $field, array $values, array<string, mixed> $options = []): $this
添加一个 IN 条件或一组条件,用于此查询的 WHERE 子句中。
与 where() 不同,此方法允许空输入,前提是您将 'allowEmpty' 设置为 true。在没有适当的完整性检查的情况下使用它要小心。
选项
types
- 用于将值绑定到查询的类型名称的关联数组allowEmpty
- 允许空数组。
参数
-
string
$field 字段
-
array
$values 值数组
-
array<string, mixed>
$options optional 选项
返回
$this
whereNotInList() ¶ public
whereNotInList(string $field, array $values, array<string, mixed> $options = []): $this
添加一个 NOT IN 条件或一组条件,用于此查询的 WHERE 子句中。
与 where() 不同,此方法允许空输入,前提是您将 'allowEmpty' 设置为 true。在没有适当的完整性检查的情况下使用它要小心。
参数
-
string
$field 字段
-
array
$values 值数组
-
array<string, mixed>
$options optional 选项
返回
$this
whereNotInListOrNull() ¶ public
whereNotInListOrNull(string $field, array $values, array<string, mixed> $options = []): $this
添加一个 NOT IN 条件或一组条件,用于此查询的 WHERE 子句中。这还允许字段为 null,并使用 IS NULL 条件,因为 null 值会导致 NOT IN 条件始终失败。
与 where() 不同,此方法允许空输入,前提是您将 'allowEmpty' 设置为 true。在没有适当的完整性检查的情况下使用它要小心。
参数
-
string
$field 字段
-
array
$values 值数组
-
array<string, mixed>
$options optional 选项
返回
$this
whereNotNull() ¶ public
whereNotNull(Cake\Database\ExpressionInterface|array|string $fields): $this
便利方法,向查询添加 NOT NULL 条件。
参数
-
Cake\Database\ExpressionInterface|array|string
$fields 一个或多个字段或表达式,它们不应为 null。
返回
$this
whereNull() ¶ public
whereNull(Cake\Database\ExpressionInterface|array|string $fields): $this
便利方法,向查询添加 IS NULL 条件。
参数
-
Cake\Database\ExpressionInterface|array|string
$fields 一个或多个字段或表达式,它们应为 null。
返回
$this
window() ¶ public
window(string $name, Cake\Database\Expression\WindowExpressionClosure $window, bool $overwrite = false): $this
添加一个命名的窗口表达式。
您有责任按数据库要求的顺序添加窗口。
参数
-
string
$name 窗口名称
-
Cake\Database\Expression\WindowExpressionClosure
$window 窗口表达式
-
bool
$overwrite 可选 清除所有先前的查询窗口表达式
返回
$this
with() ¶ public
with(Cake\Database\Expression\CommonTableExpressionClosure $cte, bool $overwrite = false): $this
向查询添加一个新的通用表表达式 (CTE)。
示例
通用表表达式可以作为预先构建的表达式对象传递
$cte = new \Cake\Database\Expression\CommonTableExpression(
'cte',
$connection
->selectQuery('*')
->from('articles')
);
$query->with($cte);
或从闭包中返回,闭包将接收一个新的通用表表达式对象作为第一个参数,并接收一个新的空白选择查询对象作为第二个参数
$query->with(function (
\Cake\Database\Expression\CommonTableExpression $cte,
\Cake\Database\Query $query
) {
$cteQuery = $query
->select('*')
->from('articles');
return $cte
->name('cte')
->query($cteQuery);
});
参数
-
Cake\Database\Expression\CommonTableExpressionClosure
$cte 要添加的 CTE。
-
bool
$overwrite 可选 是否重置 CTE 列表。
返回
$this