Skip to main content

数据库操作

获取查询结果

yii\db\ActiveQuery

ActiveQuery 主要提供以下几种方案去检索查询结果:

one():返回第一行数据。

all():根据查询结果返回所有的记录。

count():返回记录的数量。

sum():返回指定列的总和。

average():返回指定列的平均值。

min():返回指定列的最小值。

max():返回指定列的最大值。

scalar():返回查询结果第一行中第一列的值。

column():返回查询结果中第一列的值。

exists():返回一个表明查询结果是否有数据的值。

因为 ActiveQuery 是 yii\db\Query 的扩展,所以可以使用查询方法,比如 where(), orderBy() 去自定义查询方法。

ActiveQuery 还提供以下附加查询选项:

with():此查询应执行的关联的列表。

joinWith():重用关联查询定义,以便将连接添加到查询中。

indexBy():对查询结果进行索引列的名称。

asArray():是否将每个记录作为数组返回。

可以使用相同名称的方法配置这些选项。例如:

$customers = Customer::find()->with('orders')->asArray()->all();

//迭代批量查询

$query = (new Query)->from('user');
foreach ($query->batch() as $rows) {
// $rows is an array of 100 or fewer rows from user table
}

Test::find()->batch(2) as $rows) {

}

查询条件

yii\db\Query

id > 0
Test::find()->where(['>','id',0])->all();
id>=1 并且 id<=2
Test::find()->where(['between','id',1,2])->all(); //还有not between

Test::find()->where(['like','title','asddasd'])->all(); //not like | or like | or not like

and:操作数会被 AND 关键字串联起来。例如,['and', 'id=1', 'id=2'] 将会生成 id=1 AND id=2。如果操作数是一个数组,它也会按上述规则转换成 字符串。例如,['and', 'type=1', ['or', 'id=1', 'id=2']] 将会生成 type=1 AND (id=1 OR id=2)。 这个方法不会自动加引号或者转义。

or:用法和 and 操作符类似,这里就不再赘述。

not:只需要操作数 1,它将包含在 NOT() 中。例如,['not','id = 1'] 将生成 ['not', 'id=1']。操作数 1 也可以是个描述多个表达式的数组。例如 ['not', ['status' => 'draft', 'name' => 'example']] 将生成 NOT ((status='draft') AND (name='example'))。

between:第一个操作数为字段名称,第二个和第三个操作数代表的是这个字段 的取值范围。例如,['between', 'id', 1, 10] 将会生成 id BETWEEN 1 AND 10。 如果你需要建立一个值在两列之间的查询条件(比如 11 BETWEEN min_id AND max_id), 你应该使用 BetweenColumnsCondition。 请参阅 条件-对象格式 一章以了解有关条件的对象定义的更多信息。

not between:与 between 类似,除了 BETWEEN 被 NOT BETWEEN 替换 在生成条件时。

in:第一个操作数应为字段名称或者 DB 表达式。第二个操作符既可以是一个数组, 也可以是一个 Query 对象。它会转换成IN 条件语句。如果第二个操作数是一个 数组,那么它代表的是字段或 DB 表达式的取值范围。如果第二个操作数是 Query 对象,那么这个子查询的结果集将会作为第一个操作符的字段或者 DB 表达式的取值范围。 例如, ['in', 'id', [1, 2, 3]] 将生成 id IN (1, 2, 3)。 该方法将正确地为字段名加引号以及为取值范围转义。in 操作符还支持组合字段,此时, 操作数1应该是一个字段名数组,而操作数2应该是一个数组或者 Query 对象, 代表这些字段的取值范围。

not in:用法和 in 操作符类似,这里就不再赘述。

like:第一个操作数应为一个字段名称或 DB 表达式, 第二个操作数可以使字符串或数组, 代表第一个操作数需要模糊查询的值。比如,['like', 'name', 'tester'] 会生成 name LIKE '%tester%'。 如果范围值是一个数组,那么将会生成用 AND 串联起来的 多个 like 语句。例如,['like', 'name', ['test', 'sample']] 将会生成 name LIKE '%test%' AND name LIKE '%sample%'。 你也可以提供第三个可选的操作数来指定应该如何转义数值当中的特殊字符。 该操作数是一个从需要被转义的特殊字符到转义副本的数组映射。 如果没有提供这个操作数,将会使用默认的转义映射。如果需要禁用转义的功能, 只需要将参数设置为 false 或者传入一个空数组即可。需要注意的是, 当使用转义映射(又或者没有提供第三个操作数的时候),第二个操作数的值的前后 将会被加上百分号。

注意: 当使用 PostgreSQL 的时候你还可以使用 ilike, 该方法对大小写不敏感。

or like:用法和 like 操作符类似,区别在于当第二个操作数为数组时, 会使用 OR 来串联多个 LIKE 条件语句。

not like:用法和 like 操作符类似,区别在于会使用 NOT LIKE 来生成条件语句。

or not like:用法和 not like 操作符类似,区别在于会使用 OR 来串联多个 NOT LIKE 条件语句。

exists:需要一个操作数,该操作数必须是代表子查询 yii\db\Query 的一个实例, 它将会构建一个 EXISTS (sub-query) 表达式。

not exists:用法和 exists 操作符类似,它将创建一个 NOT EXISTS (sub-query) 表达式。

,<= 或者其他包含两个操作数的合法 DB 操作符:第一个操作数必须为字段的名称, 而第二个操作数则应为一个值。例如,['>', 'age', 10] 将会生成 age>10。

删除数据

//删除数据
$result =Test::find()->where[['id']=>1]->all();
$result[0]->delete();
//删除所有数据
Test::deleteAll();
Test::deleteAll('id>:id',array(':id'=>0)));

添加数据

//增加数据
$test = new Test;
$test->id = 3;
$test->title = 'title3';
$test->save();
//

修改数据

$test = Test::find()->where(['id'=>4])->one();
$test->title = 'title5';
$test->save();

关联查询

use app\models\Customer;
usr app\models\Order;

$customer = Customer::find()->where(['name'=>'zhangsan'])->one();
//第一个参数'app\models\Order'可以用Order::className()替换
//第二个参数表示的是关联关系,customer_id是order表里的,id是customer表的
//这个函数是一对多的关系,还有一个函数是一对一的 hasOne()方法参数和这个一样。
$customer->hasMany('app\models\Order',['customer_id'=>'id'])->all();

问题:
1、查询后会有缓存
使用unset清除掉实例后再进行查询
2、循环语句中的关联查询
$customer = Customer::find()->with('order')->all();
foreach($customers as $customer)
{
$customer = $customer->orders;
}

数据验证

//在模型类里面 rules 方法里定义
public function rules()
{
return [
[['id', 'title '], 'required'],
['id','integer'],
['title','string','length'=>[0,5]]
];
}
//控制器里实例化后使用validate()函数验证 hasErrors()判断
$test= new Test;
$test->id ='4';
$test->title = 'dddddddddddd';
$test->validate();
if($this->hasErrors()){
echo 'data is error';
die;
}
$test->save();