Trait yii\db\QueryTrait
实现于 | yii\db\ActiveQuery, yii\db\Query |
---|---|
可用版本 | 2.0 |
源代码 | https://github.com/yiisoft/yii2/blob/master/framework/db/QueryTrait.php |
BaseQuery 特性表示数据库查询的最小方法集。
它应该用于实现 yii\db\QueryInterface 的类中。
公共属性
属性 | 类型 | 描述 | 定义于 |
---|---|---|---|
$emulateExecution | boolean | 是否模拟实际查询执行,返回空或假结果。 | yii\db\QueryTrait |
$indexBy | string|callable|null | 查询结果应该按哪个列索引。 | yii\db\QueryTrait |
$limit | integer|yii\db\ExpressionInterface|null | 要返回的最大记录数。 | yii\db\QueryTrait |
$offset | integer|yii\db\ExpressionInterface|null | 从哪里开始返回记录的零基偏移量。 | yii\db\QueryTrait |
$orderBy | array|null | 如何对查询结果排序。 | yii\db\QueryTrait |
$where | string|array|yii\db\ExpressionInterface|null | 查询条件。 | yii\db\QueryTrait |
公共方法
方法 | 描述 | 定义于 |
---|---|---|
addOrderBy() | 向查询中添加额外的 ORDER BY 列。 | yii\db\QueryTrait |
andFilterWhere() | 向现有的 WHERE 条件添加一个额外的条件,但忽略 空操作数。 | yii\db\QueryTrait |
andWhere() | 向现有的 WHERE 条件添加一个额外的条件。 | yii\db\QueryTrait |
emulateExecution() | 设置是否模拟查询执行,防止与数据存储交互。 | yii\db\QueryTrait |
filterWhere() | 设置查询的 WHERE 部分,但忽略 空操作数。 | yii\db\QueryTrait |
indexBy() | 设置 indexBy() 属性。 | yii\db\QueryTrait |
limit() | 设置查询的 LIMIT 部分。 | yii\db\QueryTrait |
offset() | 设置查询的 OFFSET 部分。 | yii\db\QueryTrait |
orFilterWhere() | 向现有的 WHERE 条件添加一个额外的条件,但忽略 空操作数。 | yii\db\QueryTrait |
orWhere() | 向现有的 WHERE 条件添加一个额外的条件。 | yii\db\QueryTrait |
orderBy() | 设置查询的 ORDER BY 部分。 | yii\db\QueryTrait |
where() | 设置查询的 WHERE 部分。 | yii\db\QueryTrait |
受保护的方法
方法 | 描述 | 定义于 |
---|---|---|
filterCondition() | 从给定的查询条件中删除 空操作数。 | yii\db\QueryTrait |
isEmpty() | 返回一个值,指示给定值是否为“空”。 | yii\db\QueryTrait |
normalizeOrderBy() | 规范化 ORDER BY 数据的格式。 | yii\db\QueryTrait |
属性详情
是否模拟实际查询执行,返回空或假结果。
另请参阅 emulateExecution()。
要返回的最大记录数。可以是 yii\db\ExpressionInterface 的实例。如果未设置或小于 0,则表示没有限制。
从哪里开始返回记录的零基偏移量。可以是 yii\db\ExpressionInterface 的实例。如果未设置或小于 0,则表示从开头开始。
如何排序查询结果。这用于构建 SQL 语句中的 ORDER BY 子句。数组键是要排序的列,数组值是相应的排序方向,可以是 SORT_ASC 或 SORT_DESC。数组也可以包含 yii\db\ExpressionInterface 对象。如果是这种情况,表达式将转换为字符串而无需任何更改。
方法详情
向查询中添加额外的 ORDER BY 列。
另请参阅 orderBy()。
public $this addOrderBy ( $columns ) | ||
$columns | string|array|yii\db\ExpressionInterface |
要按其排序的列(和方向)。列可以以字符串(例如“id ASC, name DESC”)或数组(例如 该方法会自动引用列名,除非列包含一些括号(这意味着列包含数据库表达式)。 请注意,如果您的 order-by 是包含逗号的表达式,则应始终使用数组来表示 order-by 信息。否则,该方法将无法正确确定 order-by 列。 从 2.0.7 版本开始,可以传递 yii\db\ExpressionInterface 对象以明确地以纯 SQL 指定 ORDER BY 部分。 |
返回值 | $this |
查询对象本身 |
---|
public function addOrderBy($columns)
{
$columns = $this->normalizeOrderBy($columns);
if ($this->orderBy === null) {
$this->orderBy = $columns;
} else {
$this->orderBy = array_merge($this->orderBy, $columns);
}
return $this;
}
向现有的 WHERE 条件添加一个额外的条件,但忽略 空操作数。
新的条件和现有的条件将使用“AND”运算符连接。
此方法类似于 andWhere()。主要区别在于此方法将删除 空查询操作数。因此,此方法最适合根据用户输入的筛选值构建查询条件。
另请参阅
public $this andFilterWhere ( array $condition ) | ||
$condition | array |
新的 WHERE 条件。请参阅 where() 以了解如何指定此参数。 |
返回值 | $this |
查询对象本身 |
---|
public function andFilterWhere(array $condition)
{
$condition = $this->filterCondition($condition);
if ($condition !== []) {
$this->andWhere($condition);
}
return $this;
}
public $this andWhere ( $condition ) | ||
$condition | string|array|yii\db\ExpressionInterface |
新的 WHERE 条件。请参阅 where() 以了解如何指定此参数。 |
返回值 | $this |
查询对象本身 |
---|
public function andWhere($condition)
{
if ($this->where === null) {
$this->where = $condition;
} else {
$this->where = ['and', $this->where, $condition];
}
return $this;
}
设置是否模拟查询执行,防止与数据存储交互。
启用此模式后,返回查询结果的方法(如 yii\db\QueryInterface::one()、yii\db\QueryInterface::all()、yii\db\QueryInterface::exists() 等)将返回空值或 false 值。如果您程序逻辑指示查询不应返回任何结果,例如您设置了错误的 where 条件(如 0=1
),则应使用此方法。
public $this emulateExecution ( $value = true ) | ||
$value | boolean |
是否阻止查询执行。 |
返回值 | $this |
查询对象本身。 |
---|
public function emulateExecution($value = true)
{
$this->emulateExecution = $value;
return $this;
}
从给定的查询条件中删除 空操作数。
protected array filterCondition ( $condition ) | ||
$condition | array |
原始条件 |
返回值 | array |
已删除 空操作数 的条件。 |
---|---|---|
抛出 | yii\base\NotSupportedException |
如果条件运算符不受支持 |
protected function filterCondition($condition)
{
if (!is_array($condition)) {
return $condition;
}
if (!isset($condition[0])) {
// hash format: 'column1' => 'value1', 'column2' => 'value2', ...
foreach ($condition as $name => $value) {
if ($this->isEmpty($value)) {
unset($condition[$name]);
}
}
return $condition;
}
// operator format: operator, operand 1, operand 2, ...
$operator = array_shift($condition);
switch (strtoupper($operator)) {
case 'NOT':
case 'AND':
case 'OR':
foreach ($condition as $i => $operand) {
$subCondition = $this->filterCondition($operand);
if ($this->isEmpty($subCondition)) {
unset($condition[$i]);
} else {
$condition[$i] = $subCondition;
}
}
if (empty($condition)) {
return [];
}
break;
case 'BETWEEN':
case 'NOT BETWEEN':
if (array_key_exists(1, $condition) && array_key_exists(2, $condition)) {
if ($this->isEmpty($condition[1]) || $this->isEmpty($condition[2])) {
return [];
}
}
break;
default:
if (array_key_exists(1, $condition) && $this->isEmpty($condition[1])) {
return [];
}
}
array_unshift($condition, $operator);
return $condition;
}
设置查询的 WHERE 部分,但忽略 空操作数。
此方法类似于 where()。主要区别在于此方法将删除 空查询操作数。因此,此方法最适合根据用户输入的筛选值构建查询条件。
以下代码显示了此方法与 where() 之间的区别
// WHERE `age`=:age
$query->filterWhere(['name' => null, 'age' => 20]);
// WHERE `age`=:age
$query->where(['age' => 20]);
// WHERE `name` IS NULL AND `age`=:age
$query->where(['name' => null, 'age' => 20]);
请注意,与 where() 不同,您不能将绑定参数传递给此方法。
另请参阅
public $this filterWhere ( array $condition ) | ||
$condition | array |
应放在 WHERE 部分的条件。请参阅 where() 以了解如何指定此参数。 |
返回值 | $this |
查询对象本身 |
---|
public function filterWhere(array $condition)
{
$condition = $this->filterCondition($condition);
if ($condition !== []) {
$this->where($condition);
}
return $this;
}
设置 indexBy() 属性。
public $this indexBy ( $column ) | ||
$column | string|callable |
查询结果应按其索引的列的名称。这也可以是可调用对象(例如匿名函数),它根据给定的行数据返回索引值。可调用对象的签名应为
|
返回值 | $this |
查询对象本身 |
---|
public function indexBy($column)
{
$this->indexBy = $column;
return $this;
}
返回一个值,指示给定值是否为“空”。
如果满足以下条件之一,则该值被视为“空”
- 它是
null
, - 空字符串 (
''
), - 仅包含空格字符的字符串,
- 或空数组。
protected boolean isEmpty ( $value ) | ||
$value | mixed | |
返回值 | boolean |
如果值为 null |
---|
protected function isEmpty($value)
{
return $value === '' || $value === [] || $value === null || is_string($value) && trim($value) === '';
}
设置查询的 LIMIT 部分。
public $this limit ( $limit ) | ||
$limit | integer|yii\db\ExpressionInterface|null |
限制数量。使用 null 或负值禁用限制。 |
返回值 | $this |
查询对象本身 |
---|
public function limit($limit)
{
$this->limit = $limit;
return $this;
}
规范化 ORDER BY 数据的格式。
protected array normalizeOrderBy ( $columns ) | ||
$columns | array|string|yii\db\ExpressionInterface|null |
要标准化的列值。参见 orderBy() 和 addOrderBy()。 |
protected function normalizeOrderBy($columns)
{
if (empty($columns)) {
return [];
} elseif ($columns instanceof ExpressionInterface) {
return [$columns];
} elseif (is_array($columns)) {
return $columns;
}
$columns = preg_split('/\s*,\s*/', trim($columns), -1, PREG_SPLIT_NO_EMPTY);
$result = [];
foreach ($columns as $column) {
if (preg_match('/^(.*?)\s+(asc|desc)$/i', $column, $matches)) {
$result[$matches[1]] = strcasecmp($matches[2], 'desc') ? SORT_ASC : SORT_DESC;
} else {
$result[$column] = SORT_ASC;
}
}
return $result;
}
设置查询的 OFFSET 部分。
public $this offset ( $offset ) | ||
$offset | integer|yii\db\ExpressionInterface|null |
偏移量。使用 null 或负值禁用偏移量。 |
返回值 | $this |
查询对象本身 |
---|
public function offset($offset)
{
$this->offset = $offset;
return $this;
}
向现有的 WHERE 条件添加一个额外的条件,但忽略 空操作数。
新的条件和现有的条件将使用 'OR' 运算符连接。
此方法类似于 orWhere()。主要区别在于此方法将删除 空的查询操作数。因此,此方法最适合根据用户输入的筛选值构建查询条件。
另请参阅
public $this orFilterWhere ( array $condition ) | ||
$condition | array |
新的 WHERE 条件。请参阅 where() 以了解如何指定此参数。 |
返回值 | $this |
查询对象本身 |
---|
public function orFilterWhere(array $condition)
{
$condition = $this->filterCondition($condition);
if ($condition !== []) {
$this->orWhere($condition);
}
return $this;
}
public $this orWhere ( $condition ) | ||
$condition | string|array|yii\db\ExpressionInterface |
新的 WHERE 条件。请参阅 where() 以了解如何指定此参数。 |
返回值 | $this |
查询对象本身 |
---|
public function orWhere($condition)
{
if ($this->where === null) {
$this->where = $condition;
} else {
$this->where = ['or', $this->where, $condition];
}
return $this;
}
设置查询的 ORDER BY 部分。
另请参阅 addOrderBy()。
public $this orderBy ( $columns ) | ||
$columns | string|array|yii\db\ExpressionInterface|null |
要按其排序的列(和方向)。列可以以字符串(例如 该方法会自动引用列名,除非列包含一些括号(这意味着列包含数据库表达式)。 请注意,如果您的 order-by 是包含逗号的表达式,则应始终使用数组来表示 order-by 信息。否则,该方法将无法正确确定 order-by 列。 从 2.0.7 版本开始,可以传递 yii\db\ExpressionInterface 对象以明确地以纯 SQL 指定 ORDER BY 部分。 |
返回值 | $this |
查询对象本身 |
---|
public function orderBy($columns)
{
$this->orderBy = $this->normalizeOrderBy($columns);
return $this;
}
注册 或 登录 以发表评论。