类 DeleteQuery
常量
属性概述
-
$_connection protected
Cake\Database\Connection
用于执行此查询的连接实例。
-
$_dirty protected
bool
指示此查询的内部状态是否已更改,这用于丢弃内部缓存的对象,例如转换后的查询或对已执行语句的引用。
-
$_functionsBuilder protected
Cake\Database\FunctionsBuilder|null
用于生成任意 SQL 函数的函数构建器对象的实例。
-
$_parts protected
array<string, mixed>
将用于构建此查询的 SQL 部分列表。
-
$_repository protected
Cake\ORM\Table
此查询绑定到的存储库/表对象的实例。
-
$_statement protected
Cake\Database\StatementInterface|null
-
$_type protected
string
此查询的类型。
-
$_typeMap protected
Cake\Database\TypeMap|null
-
$_valueBinder protected
Cake\Database\ValueBinder|null
负责生成查询占位符并将与每个占位符关联的值临时存储的对象。
-
$connectionRole protected
string
连接角色 ('read' 或 'write')
方法概述
-
__clone() public
处理清除迭代器和克隆所有表达式和值绑定器。
-
__construct() public
构造函数
-
__debugInfo() public
返回一个数组,可用于描述此对象的内部状态。
-
__toString() public
返回此查询的字符串表示形式(完整的 SQL 语句)。
-
_conjugate() protected
帮助函数,用于通过组合 QueryExpression 对象来构建条件。
-
_dirty() protected
将查询标记为脏,从内存缓存中删除任何预处理信息。
-
_expressionsVisitor() protected
traverseExpressions() 使用的查询部分遍历方法
-
_makeJoin() protected
返回一个数组,可以传递给 join 方法以描述单个连接子句
-
addDefaultTypes() public
提示此对象在为数据库转换条件时关联正确的类型。这是通过从与传递的表对象关联的模式中提取字段类型来完成的。这可以防止用户在指定条件时重复自己。
-
andWhere() public
使用 AND 运算符将任何先前定义的条件集连接到提供的列表。此函数以与方法
where
相同的格式接受条件列表,因此您可以使用数组、表达式对象回调函数或字符串。 -
bind() public
将查询占位符与值和类型关联起来。
-
clause() public
返回存储在指定子句中的任何数据。这对于修改查询的任何内部部分很有用,并且 SQL 方言使用它来在执行查询之前相应地转换查询。可以检索的有效子句是:delete、update、set、insert、values、select、distinct、from、join、set、where、group、having、order、limit、offset、union 和 intersect。
-
comment() public
将作为注释附加到生成的查询的字符串或表达式
-
delete() public
创建删除查询。
-
epilog() public
将附加到生成的查询的字符串或表达式
-
execute() public
编译此查询的 SQL 表示形式并使用配置的连接对象执行它。返回结果语句对象。
-
expr() public
返回一个新的 QueryExpression 对象。当使用流畅的界面构建复杂查询时,这是一个方便的函数。您也可以在子类中重写此函数,以便在需要时使用更专业的 QueryExpression 类。
-
from() public
添加一个或多个要在 FROM 子句中使用的表,以供此查询使用。表可以作为字符串数组、表达式对象数组、单个表达式或单个字符串传递。
-
func() public
返回函数构建器对象的实例,可用于生成任意 SQL 函数。
-
getConnection() public
获取用于执行和转换此查询的连接实例。
-
getConnectionRole() public
返回连接角色 ('read' 或 'write')
-
getDefaultTypes() public
获取当前类型映射的默认类型。
-
getRepository() public
返回此查询将使用的默认存储库对象,即将在 from 子句中出现的表。
-
getTypeMap() public
返回现有的类型映射。
-
getValueBinder() public
返回当前使用的 ValueBinder 实例。
-
identifier() public
创建一个引用标识符的表达式。标识符用于引用字段名称,并允许 SQL 编译器应用引号或转义标识符。
-
innerJoin() public
向查询添加单个
INNER JOIN
子句。 -
join() public
添加一个或多个表,以作为 JOIN 子句供此查询使用。表可以作为字符串数组、描述连接部分的数组、包含多个连接描述的数组或单个字符串传递。
-
leftJoin() public
向查询添加单个
LEFT JOIN
子句。 -
limit() public
设置应从数据库检索的记录数量,接受一个整数或一个计算结果为整数的表达式对象。在某些数据库中,此操作可能不受支持或需要转换查询才能限制结果集大小。
-
modifier() public
在
SELECT
语句中添加一个或多个SELECT
修饰符。 -
newExpr() public
返回一个新的 QueryExpression 对象。当使用流畅的界面构建复杂查询时,这是一个方便的函数。您也可以在子类中重写此函数,以便在需要时使用更专业的 QueryExpression 类。
-
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
如果已定义,则移除连接。
-
rightJoin() public
向查询添加一个
RIGHT JOIN
子句。 -
rowCountAndClose() public
执行该查询的 SQL 并立即关闭语句,然后返回更改记录的行数。
-
setConnection() public
设置用于执行和转换该查询的连接实例。
-
setDefaultTypes() public
覆盖实现对象中字段的默认类型映射。
-
setRepository() public
设置该查询将使用的默认表对象,并构成
FROM
子句。 -
setTypeMap() public
如果 $typeMap 是数组,则创建一个新的 TypeMap,否则用给定的 TypeMap 交换它。
-
setValueBinder() public
覆盖当前的值绑定器。
-
sql() public
返回该对象的 SQL 表示。
-
traverse() public
将遍历每个指定的部件。遍历函数可以使用闭包或实例变量中的变量来聚合结果。此函数通常用作遍历所有将用于构建查询的查询部件的一种方法。
-
traverseExpressions() public
此函数的工作原理类似于 traverse() 函数,但不同之处在于它对整个表达式树进行深度优先遍历。这将对在该查询中存储的每个 ExpressionInterface 对象执行提供的回调函数,无论其在查询中的任何嵌套深度或任何部分。
-
traverseParts() public
将遍历提供的部件。
-
type() public
返回该查询的类型(select、insert、update、delete)
-
where() public
添加一个或一组用于该查询 WHERE 子句的条件。条件可以表示为键为字段的数组,其中包含比较运算符,数组的值将用于将字段与该文字进行比较。最后,条件可以表示为单个字符串或字符串数组。
-
whereInList() public
添加一个或一组用于该查询 WHERE 子句的 IN 条件。
-
whereNotInList() public
添加一个或一组用于该查询 WHERE 子句的 NOT IN 条件。
-
whereNotInListOrNull() public
添加一个或一组用于该查询 WHERE 子句的 NOT IN 条件。这还允许字段为 null,并使用 IS NULL 条件,因为 null 值将导致 NOT IN 条件始终失败。
-
whereNotNull() public
便利方法,向查询添加 NOT NULL 条件。
-
whereNull() public
便利方法,向查询添加 IS NULL 条件。
-
with() public
向查询添加一个新的通用表表达式 (CTE)。
方法详情
__debugInfo() ¶ public
__debugInfo(): array<string, mixed>
返回一个数组,可用于描述此对象的内部状态。
返回值
array<string, mixed>
_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
_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
addDefaultTypes() ¶ public
addDefaultTypes(Cake\ORM\Table $table): $this
提示此对象在为数据库转换条件时关联正确的类型。这是通过从与传递的表对象关联的模式中提取字段类型来完成的。这可以防止用户在指定条件时重复自己。
此方法返回相同的查询对象以进行链接。
参数
-
Cake\ORM\Table
$table 要从中提取类型的表
返回值
$this
andWhere() ¶ public
andWhere(Cake\Database\ExpressionInterfaceClosure|array|string $conditions, array<string, string> $types = []): $this
使用 AND 运算符将任何先前定义的条件集连接到提供的列表。此函数以与方法 where
相同的格式接受条件列表,因此您可以使用数组、表达式对象回调函数或字符串。
需要注意的是,当调用此函数时,为该查询定义的任何先前条件集都将被视为 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 要使用 AND 添加的条件。
-
array<string, string>
$types optional 用于将值绑定到查询的类型名称的关联数组
返回值
$this
另请参阅
\Cake\Database\TypeFactory
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 optional 映射的类型名称,用于在发送到数据库时进行类型转换
返回值
$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: integer 或 QueryExpression,当未设置时返回 null
- offset: integer 或 QueryExpression,当未设置时返回 null
- union: array
- intersect: array
参数
-
string
$name 要返回的子句的名称
返回值
mixed
抛出
InvalidArgumentException
当指定的子句不存在时。
comment() ¶ public
comment(string|null $expression = null): $this
将作为注释附加到生成的查询的字符串或表达式
示例
$query->select('id')->where(['author_id' => 1])->comment('Filter for admin user');
注释内容是原始 SQL,不适合与用户提供的 data 一起使用。
参数
-
string|null
$expression optional 要添加的注释
返回值
$this
delete() ¶ public
delete(string|null $table = null): $this
创建删除查询。
可以与 from()、where() 和其他方法结合使用,以创建具有特定条件的删除查询。
参数
-
string|null
$table 可选 删除时要使用的表。
返回值
$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 表示形式并使用配置的连接对象执行它。返回结果语句对象。
在内部执行查询会执行几个步骤,第一步是让连接将此对象转换为适合其特定方言的形式,这可能会导致生成一个不同的 Query 对象,该对象将是实际要执行的对象。紧随其后的是将文字值传递给连接,以便以安全的方式将其绑定到查询。最后,使用自定义对象装饰生成的语句,以便在需要时为检索到的每一行执行回调。
生成的语句是可遍历的,因此它可以在任何循环中使用,就像使用数组一样。
此方法可以在查询子类中被覆盖,以装饰围绕查询执行的行为。
返回值
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
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>
getRepository() ¶ public
getRepository(): Cake\ORM\Table
返回此查询将使用的默认存储库对象,即将在 from 子句中出现的表。
返回值
Cake\ORM\Table
getValueBinder() ¶ public
getValueBinder(): Cake\Database\ValueBinder
返回当前使用的 ValueBinder 实例。
ValueBinder 负责生成查询占位符,并将值临时关联到这些占位符,以便可以将它们正确传递给语句对象。
返回值
Cake\Database\ValueBinder
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 optional 与用于将值转换为相应数据库表示的条件相关的类型列表。
返回值
$this
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 optional 用于将值绑定到查询的类型名称的关联数组
-
bool
$overwrite 可选 是否重置连接并使用传递的列表。
返回值
$this
另请参阅
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
limit() ¶ public
limit(Cake\Database\ExpressionInterface|int|null $limit): $this
设置应从数据库检索的记录数量,接受一个整数或一个计算结果为整数的表达式对象。在某些数据库中,此操作可能不受支持或需要转换查询才能限制结果集大小。
示例
$query->limit(10) // generates LIMIT 10
$query->limit($query->newExpr()->add(['1 + 1'])); // LIMIT (1 + 1)
参数
-
Cake\Database\ExpressionInterface|int|null
$limit 要返回的记录数
返回值
$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
offset() ¶ public
offset(Cake\Database\ExpressionInterface|int|null $offset): $this
设置从原始结果集中跳过的记录数量。这通常用于对大型结果进行分页。接受一个整数或一个计算结果为整数的表达式对象。
在某些数据库中,此操作可能不受支持,或者需要将查询转换才能限制结果集的大小。
示例
$query->offset(10) // generates OFFSET 10
$query->offset($query->newExpr()->add(['1 + 1'])); // OFFSET (1 + 1)
参数
-
Cake\Database\ExpressionInterface|int|null
$offset 要跳过的记录数
返回值
$this
order() ¶ public
order(Cake\Database\ExpressionInterfaceClosure|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']);
和
$query->orderBy(function ($exp, $query) {
return [$exp->add(['id % 2 = 0']), 'title' => 'ASC'];
});
两者都将变成
ORDER BY (id %2 = 0), title ASC
查询构建器不会对排序字段/方向进行清理。在将用户提供的数据传递给 order()
时,您应该使用允许的字段/方向列表。
如果您需要将复杂表达式设置为排序条件,则应使用 orderByAsc()
或 orderByDesc()
。
参数
-
Cake\Database\ExpressionInterfaceClosure|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(Cake\Database\ExpressionInterfaceClosure|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']);
和
$query->orderBy(function ($exp, $query) {
return [$exp->add(['id % 2 = 0']), 'title' => 'ASC'];
});
两者都将变成
ORDER BY (id %2 = 0), title ASC
查询构建器不会对排序字段/方向进行清理。在将用户提供的数据传递给 order()
时,您应该使用允许的字段/方向列表。
如果您需要将复杂表达式设置为排序条件,则应使用 orderByAsc()
或 orderByDesc()
。
参数
-
Cake\Database\ExpressionInterfaceClosure|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 optional 您希望在页面中显示的行数。如果为 null,将使用当前限制子句。
返回值
$this
抛出
InvalidArgumentException
如果页码 < 1。
removeJoin() ¶ public
removeJoin(string $name): $this
如果已定义,则移除连接。
当您重新定义联接或想要重新排序联接子句时很有用。
参数
-
string
$name 要删除的联接的别名/名称。
返回值
$this
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();
上面的示例将所有 false 记录的 published 列更改为 true,并返回更新的记录数。
返回值
int
setConnection() ¶ public
setConnection(Cake\Database\Connection $connection): $this
设置用于执行和转换该查询的连接实例。
参数
-
Cake\Database\Connection
$connection 连接实例
返回值
$this
setDefaultTypes() ¶ public
setDefaultTypes(array<int|string, string> $types): $this
覆盖实现对象中字段的默认类型映射。
如果您需要设置跨多个函数/表达式共享的类型映射,此方法很有用。
要添加默认值而不覆盖现有值,请使用getTypeMap()->addDefaults()
参数
-
array<int|string, string>
$types 要设置的类型数组。
返回值
$this
另请参阅
setRepository() ¶ public
setRepository(Cake\Datasource\RepositoryInterface $repository): $this
设置该查询将使用的默认表对象,并构成 FROM
子句。
参数
-
Cake\Datasource\RepositoryInterface
$repository 要使用的默认表对象
返回值
$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 optional
返回值
string
traverse() ¶ public
traverse(Closure $callback): $this
将遍历每个指定的部件。遍历函数可以使用闭包或实例变量中的变量来聚合结果。此函数通常用作遍历所有将用于构建查询的查询部件的一种方法。
回调将接收两个参数,第一个参数是正在迭代的查询部分的值,第二个参数是该部分的名称。
示例
$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 查询。
回调将接收两个参数,第一个参数是正在迭代的查询部分的值,第二个参数是该部分的名称。
示例
$query->select(['title'])->from('articles')->traverse(function ($value, $clause) {
if ($clause === 'select') {
var_dump($value);
}
}, ['select', 'from']);
参数
-
Closure
$visitor 对每个部分执行的回调
-
list<string>
$parts 要遍历的查询部分列表
返回值
$this
where() ¶ public
where(Cake\Database\ExpressionInterfaceClosure|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')
您可以根据需要使用连词嵌套条件。有时,您可能希望为同一个键定义两种不同的选项,在这种情况下,您可以将每个条件包装在一个新的数组中
$query->where(['OR' => [['published' => false], ['published' => true]])
将导致
WHERE (published = false) OR (published = true)
请记住,每次调用 where() 将第三个参数设置为 false(默认)时,它都会使用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 注入的攻击。但是,键不被视为不安全的输入,应进行验证/清理。
如果使用字符串条件,请确保您的值被正确地引号包围。最安全的做法是永远不要使用字符串条件。
使用可空值
当使用可以为空的值时,可以使用“IS”关键字让 ORM 根据值的类型生成正确的 SQL。
$query->where([
'posted >=' => new DateTime('3 days ago'),
'category_id IS' => $category,
]);
如果 $category 为 null
- 它实际上会将其转换为 category_id IS NULL
- 如果它是 4
,它将将其转换为 category_id = 4
。
参数
-
Cake\Database\ExpressionInterfaceClosure|array|string|null
$conditions 可选 用于过滤的条件。
-
array<string, string>
$types optional 用于将值绑定到查询的类型名称的关联数组
-
bool
$overwrite 可选 是否用传入的列表重置条件。
返回值
$this
另请参阅
\Cake\Database\Expression\QueryExpression
whereInList() ¶ 公共
whereInList(string $field, array $values, array<string, mixed> $options = []): $this
添加一个或一组用于该查询 WHERE 子句的 IN 条件。
与 where() 相反,此方法允许空输入(如果将 'allowEmpty' 设置为 true)。在没有进行适当的完整性检查的情况下,请谨慎使用它。
选项
types
- 用于将值绑定到查询的类型名称的关联数组allowEmpty
- 允许空数组。
参数
-
string
$field 字段
-
array
$values 值数组
-
array<string, mixed>
$options 可选 选项
返回值
$this
whereNotInList() ¶ 公共
whereNotInList(string $field, array $values, array<string, mixed> $options = []): $this
添加一个或一组用于该查询 WHERE 子句的 NOT IN 条件。
与 where() 相反,此方法允许空输入(如果将 'allowEmpty' 设置为 true)。在没有进行适当的完整性检查的情况下,请谨慎使用它。
参数
-
string
$field 字段
-
array
$values 值数组
-
array<string, mixed>
$options 可选 选项
返回值
$this
whereNotInListOrNull() ¶ 公共
whereNotInListOrNull(string $field, array $values, array<string, mixed> $options = []): $this
添加一个或一组用于该查询 WHERE 子句的 NOT IN 条件。这还允许字段为 null,并使用 IS NULL 条件,因为 null 值将导致 NOT IN 条件始终失败。
与 where() 相反,此方法允许空输入(如果将 'allowEmpty' 设置为 true)。在没有进行适当的完整性检查的情况下,请谨慎使用它。
参数
-
string
$field 字段
-
array
$values 值数组
-
array<string, mixed>
$options 可选 选项
返回值
$this
whereNotNull() ¶ 公共
whereNotNull(Cake\Database\ExpressionInterface|array|string $fields): $this
便利方法,向查询添加 NOT NULL 条件。
参数
-
Cake\Database\ExpressionInterface|array|string
$fields 一个或多个字段或表达式,它们应该不为空。
返回值
$this
whereNull() ¶ 公共
whereNull(Cake\Database\ExpressionInterface|array|string $fields): $this
便利方法,向查询添加 IS NULL 条件。
参数
-
Cake\Database\ExpressionInterface|array|string
$fields 一个或多个字段或表达式,它们应该为空。
返回值
$this
with() ¶ 公共
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);
或者从闭包中返回,闭包将接收一个新的公共表表达式对象作为第一个参数,以及一个新的空白 select 查询对象作为第二个参数。
$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