CakePHP
  • 文档
    • 手册
    • API
    • 视频
    • 报告安全问题
    • 隐私政策
    • 徽标 & 商标
  • 商业解决方案
  • 周边商品
  • 公路旅行
  • 团队
  • 社区
    • 社区
    • 参与进来
    • 问题 (Github)
    • 烘焙坊
    • 精选资源
    • 培训
    • 聚会
    • 我的 CakePHP
    • CakeFest
    • 新闻稿
    • Linkedin
    • YouTube
    • Facebook
    • Twitter
    • Mastodon
    • 帮助 & 支持
    • 论坛
    • Stack Overflow
    • IRC
    • Slack
    • 付费支持
CakePHP

C CakePHP 5.1 Chiffon API

  • 项目
    • CakePHP
      • CakePHP
      • Chronos
      • Elastic Search
      • 队列
  • 版本
    • 5.1
      • 5.1
      • 5.0
      • 4.5
      • 4.4
      • 4.3
      • 4.2
      • 4.1
      • 4.0
      • 3.10
      • 3.9
      • 3.8
      • 3.7
      • 3.6
      • 3.5
      • 3.4
      • 3.3
      • 3.2
      • 3.1
      • 3.0
      • 2.10
      • 2.9
      • 2.8
      • 2.7
      • 2.6
      • 2.5
      • 2.4
      • 2.3
      • 2.2
      • 2.1
      • 2.0
      • 1.3
      • 1.2

命名空间

  • 全局
  • Cake
    • 缓存
    • 集合
    • 命令
    • 控制台
    • 控制器
    • 核心
    • 数据库
    • 数据源
    • 错误
    • 事件
    • 表单
    • Http
    • I18n
    • 日志
    • 邮件发送器
    • 网络
    • ORM
      • 关联
      • 行为
      • 异常
      • 定位器
      • 查询
      • 规则
    • 路由
    • 测试套件
    • 工具
    • 验证
    • 视图

类 SelectQuery

扩展 Cake\Database\Query\SelectQuery 类,提供与关联加载、自动字段选择、自动类型转换相关的新方法,并将结果包装到一个特定的迭代器中,该迭代器将负责在需要时对结果进行水化。

命名空间: Cake\ORM\Query

常量

  • 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)。

方法详细说明

__clone() ¶ public

__clone(): void

处理清除迭代器并克隆所有表达式和值绑定器。

处理克隆渴望加载器。

返回
void

__construct() ¶ public

__construct(Cake\ORM\Table $table)

构造函数

参数
Cake\ORM\Table $table

此查询开始的表

__debugInfo() ¶ public

__debugInfo(): array<string, mixed>

返回一个数组,该数组可用于描述此对象的内部状态。

返回
array<string, mixed>

__toString() ¶ public

__toString(): string

返回此查询的字符串表示形式(完整的 SQL 语句)。

返回
string

_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

_addDefaultFields() ¶ protected

_addDefaultFields(): void

检查是否有任何设置的字段用于选择,否则添加默认表的全部字段。

返回
void

_addDefaultSelectTypes() ¶ protected

_addDefaultSelectTypes(): void

设置选择子句中字段转换的默认类型

返回
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>

_dirty() ¶ protected

_dirty(): void

将查询标记为脏,从内存缓存中删除任何预处理的信息,例如以前的结果

返回
void

_execute() ¶ protected

_execute(): iterable

执行此查询并返回包含结果的迭代器。

返回
iterable

_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

_performCount() ¶ protected

_performCount(): int

执行并返回查询的 COUNT(*)。

返回
int

_transformQuery() ¶ protected

_transformQuery(): void

在查询对象执行之前应用一些默认值。

具体添加 FROM 子句,如果未指定则添加默认表字段,并应用急切加载使用 contain 定义的关联所需的连接

它还为 select 子句中的列设置默认类型

返回
void
另请参见
\Cake\Database\Query::execute()

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
另请参见
\Cake\Database\Query::andWhere()

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
另请参见
getOptions()

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

clearContain() ¶ public

clearContain(): $this

从当前查询中清除包含的关联。

返回
$this

clearResult() ¶ public

clearResult(): $this

从当前查询对象中清除内部结果缓存和内部计数值。

返回
$this

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

count() ¶ public

count(): int

返回查询的总结果数。

返回查询的 COUNT(*)。如果查询未被修改,并且计数已执行,则返回缓存的值

返回
int

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

disableAutoAliasing() ¶ public

disableAutoAliasing(): $this

禁用自动将表的别名添加到 SELECT 子句的字段中。

返回
$this

disableAutoFields() ¶ public

disableAutoFields(): $this

禁用自动追加字段。

返回
$this

disableBufferedResults() ¶ public

disableBufferedResults(): $this

禁用缓冲结果。

禁用缓冲将减少内存消耗,因为获取的结果不会为将来的迭代而保留。

返回
$this

disableHydration() ¶ public

disableHydration(): $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

getConnectionRole() ¶ public

getConnectionRole(): string

返回连接角色('read' 或 'write')。

返回
string

getContain() ¶ public

getContain(): array
返回
array

getDefaultTypes() ¶ public

getDefaultTypes(): array<int|string, string>

获取当前类型图的默认类型。

返回
array<int|string, string>

getEagerLoader() ¶ public

getEagerLoader(): Cake\ORM\EagerLoader

返回当前配置的实例。

返回
Cake\ORM\EagerLoader

getIterator() ¶ public

getIterator(): Cake\Datasource\ResultSetInterfaceCake\Datasource\EntityInterface|array>

执行此查询并返回结果迭代器。 此函数是实现 IteratorAggregate 接口所必需的,它允许迭代查询,而无需手动调用 execute(),从而使查询看起来像结果集而不是查询本身。

返回
Cake\Datasource\ResultSetInterfaceCake\Datasource\EntityInterface|array>

getMapReducers() ¶ public

getMapReducers(): array

返回先前注册的映射缩减例程的列表。

返回
array

getOptions() ¶ public

getOptions(): array

返回一个包含应用于此查询的自定义选项的数组,这些选项尚未由该类的其他方法处理。

示例

 $query->applyOptions(['doABarrelRoll' => true, 'fields' => ['id', 'name']);
 $query->getOptions(); // Returns ['doABarrelRoll' => true]
返回
array
另请参见
\Cake\Datasource\QueryInterface::applyOptions() 以了解此类将处理但此函数不会返回的选项
applyOptions()

getRepository() ¶ public

getRepository(): Cake\ORM\Table

返回此查询将使用的默认存储库对象,即将在 from 子句中出现的表。

返回
Cake\ORM\Table

getResultDecorators() ¶ public

getResultDecorators(): array

获取结果装饰器。

返回
array

getResultFormatters() ¶ public

getResultFormatters(): arrayClosure>

返回先前注册的格式例程的列表。

返回
arrayClosure>

getSelectTypeMap() ¶ public

getSelectTypeMap(): Cake\Database\TypeMap

获取 TypeMap 类,其中存储了 select 子句中每个字段的类型。

返回
Cake\Database\TypeMap

getTypeMap() ¶ public

getTypeMap(): Cake\Database\TypeMap

返回现有的类型图。

返回
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
另请参见
\Cake\Database\Query::where()

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
另请参见
\Cake\ORM\Query\SeletQuery::matching()

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

isEagerLoaded() ¶ public

isEagerLoaded(): bool

返回当前配置的查询 _eagerLoaded 值

返回
bool

isHydrationEnabled() ¶ public

isHydrationEnabled(): 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
另请参见
\Cake\Database\TypeFactory

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
另请参见
\Cake\Collection\Iterator\MapReduce 有关如何将数据发送到 map reducer 的详细信息。

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
另请参见
\Cake\Database\TypeMap::setDefaults()

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

toArray() ¶ public

toArray(): array

在执行查询后,返回结果的数组表示形式。

返回
array

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

type() ¶ public

type(): string

返回此查询的类型(select、insert、update、delete)

返回
string

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

useReadRole() ¶ public

useReadRole(): $this

将连接角色设置为读取。

返回
$this

useWriteRole() ¶ public

useWriteRole(): $this

将连接角色设置为写入。

返回
$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

属性详细说明

$_autoFields ¶ protected

跟踪原始查询是否应包含来自顶级表的字段。

类型
bool|null

$_beforeFindFired ¶ protected

如果此查询的 beforeFind 事件已触发,则为真

类型
bool

$_cache ¶ protected

如果此查询已启用缓存,则为一个查询缓存实例。

类型
Cake\Datasource\QueryCacher|null

$_connection ¶ protected

要用于执行此查询的连接实例。

类型
Cake\Database\Connection

$_counter ¶ protected

一个回调函数,用于计算此查询将匹配的记录总数,当不使用 limit 时

类型
Closure|null

$_dirty ¶ protected

指示此查询的内部状态是否已更改,这用于丢弃内部缓存的对象,例如转换后的查询或对已执行语句的引用。

类型
bool

$_eagerLoaded ¶ protected

查询是独立的还是预加载操作的结果。

类型
bool

$_eagerLoader ¶ protected

一个类的实例,负责存储关联包含并在此查询执行时预加载它们

类型
Cake\ORM\EagerLoader|null

$_formatters ¶ protected

格式化器类或回调函数的列表,这些类或回调函数将在提取时对结果进行后处理

类型
arrayClosure>

$_functionsBuilder ¶ protected

用于生成任意 SQL 函数的函数构建器对象的实例。

类型
Cake\Database\FunctionsBuilder|null

$_hasFields ¶ protected

用户是否在执行之前选择了任何字段,这用于确定是否应自动选择任何字段。

类型
bool|null

$_hydrate ¶ 受保护

是否将结果水化为实体对象

类型
bool

$_mapReduce ¶ 受保护

应该应用于查询结果的映射-归约例程列表

类型
array

$_options ¶ 受保护

保存使用 applyOptions 传递的任何自定义选项,这些选项无法通过此类中的任何方法处理。

类型
array

$_parts ¶ 受保护

将用于构建此查询的 SQL 部分列表。

类型
array<string, mixed>

$_repository ¶ 受保护

此查询绑定到的存储库/表对象的实例。

类型
Cake\ORM\Table

$_resultDecorators ¶ 受保护

一个回调函数列表,这些回调函数将在检索后被调用以更改来自结果语句的每一行。每个回调函数将接收行数组作为第一个参数。

类型
listClosure>

$_results ¶ 受保护

一个 ResultSet。

如果设置,SelectQuery 执行将被绕过。

类型
iterable|null

$_resultsCount ¶ 受保护

查询的 COUNT(*)。

如果设置,计数查询执行将被绕过。

类型
int|null

$_selectTypeMap ¶ 受保护

选择子句中字段的类型映射

类型
Cake\Database\TypeMap|null

$_statement ¶ 受保护

类型
Cake\Database\StatementInterface|null

$_type ¶ 受保护

此查询的类型。

类型
string

$_typeMap ¶ 受保护

类型
Cake\Database\TypeMap|null

$_valueBinder ¶ 受保护

负责生成查询占位符并临时存储与每个占位符关联的值的对象。

类型
Cake\Database\ValueBinder|null

$aliasingEnabled ¶ 受保护

是否为字段生成别名。

类型
bool

$bufferedResults ¶ 受保护

用于跟踪是否启用了缓冲结果的布尔值。

类型
bool

$connectionRole ¶ 受保护

连接角色 ('read' 或 'write')

类型
string

$resultSetFactory ¶ 受保护

结果集工厂

类型
Cake\ORM\ResultSetFactoryCake\Datasource\EntityInterface|array>

$typeCastEnabled ¶ 受保护

跟踪标志,用于禁用强制转换

类型
bool
OpenHub
Pingping
Linode
  • 商业解决方案
  • 展示
  • 文档
  • 手册
  • API
  • 视频
  • 报告安全问题
  • 隐私政策
  • 徽标 & 商标
  • 社区
  • 参与进来
  • 问题 (Github)
  • 烘焙坊
  • 精选资源
  • 培训
  • 聚会
  • 我的 CakePHP
  • CakeFest
  • 新闻稿
  • Linkedin
  • YouTube
  • Facebook
  • Twitter
  • Mastodon
  • 帮助 & 支持
  • 论坛
  • Stack Overflow
  • IRC
  • Slack
  • 付费支持

使用 CakePHP API 文档 生成