ActiveRecord
提供了数据库与模型(MVC 中的 M,Model) 的交互QueryBuilder
用于创建动态的查询语句MySQL MariaDB SQLite PostgreSQL CUBRID Oracle MSSQL
yii\db\Connection::$driverName
属性yii\db\Command
createCommand
bindValue bindValues bindParam()
yii\db\Command
里 SQL 执行方法中的一个 queryOne
yii\db\Command::execute()
方法, 返回执行 SQL 所影响到的行数insert(),update(),delete(),batchInsert()
Upsert
原子操作[[column name]]
使用两对方括号来将列名括起来{
{table name}}
使用两对大括号来将表名括起来yii\db\Connection::$tablePrefix
属性来指定{
{%table_name}}
, 百分号将被自动地替换为你在配置 DB 组件时指定的表前缀transaction()
beginTransaction()
commit()
rollBack()
yii\db\Transaction::READ_UNCOMMITTED
最弱的隔离级别,脏读、不可重复读以及幻读都可能发生yii\db\Transaction::READ_COMMITTED
避免了脏读yii\db\Transaction::REPEATABLE_READ
避免了脏读和不可重复读yii\db\Transaction::SERIALIZABLE
最强的隔离级别, 避免了上述所有的问题。Connection
组件支持从库间的负载均衡和失效备援yii\db\Connection::serverRetryInterval
内将不再试着连接该服务器DB Connection
的 getTableSchema()
方法来检索某张表的定义信息查询构建器建立在 Database Access Objects
基础之上
使用流程
yii\db\Query
对象来代表一条 SELECT SQL 语句的不同子句,如 SELECT, FROMyii\db\Query
的一个查询方法yii\db\Query
隐式调用 yii\db\QueryBuilder
yii\db\QueryBuilder
主要负责将 DBMS 不相关的 yii\db\Query
对象转换成 DBMS 相关的 SQL 语句创建查询
distinct()
方法来去除重复行addSelect()
方法来选取附加字段'status=1'
['status' => 1, 'type' => 2]
['like', 'name', 'test']
and, or, not, between, not between, in, not in, like, or like, not like, or not like, exists, not exists, >, <=
new LikeCondition('name', 'LIKE', 'test')
AND, OR -> yii\db\conditions\ConjunctionCondition
NOT -> yii\db\conditions\NotCondition
IN, NOT IN -> yii\db\conditions\InCondition
BETWEEN, NOT BETWEEN -> yii\db\conditions\BetweenCondition
…andwhere orWhere
在原有条件的基础上 附加额外的条件orderBy(),groupBy(),having(),limit(),offset(),join(),union()
查询方法
yii\db\Query
提供了一整套的用于不同查询目的的方法all(),one(),column(),scalar(),exists(),count()
sum($q), average($q), max($q), min($q)
等
$q
是一个必选参数,既可以是一个字段名称,又可以是一个 DB 表达式yii\db\Query
当中的一个查询方法内部运作机制
yii\db\Query
的构造基础之上,调用 yii\db\QueryBuilder
来生成一条 SQL 语句yii\db\Command
对象yii\db\Command
的查询方法$command = ...->createCommand()
$command->sql
打印 SQL 语句print_r($command->params)
打印被绑定的参数$command->queryAll()
返回查询结果的所有行索引查询结果 indexBy('id')
批处理查询
$query->batch()
或 $query->each()
其返回值是一个迭代器
Iterator
接口 yii\db\BatchQueryResult
的对象MySQL中批量查询的局限
添加自定义查询条件和表达式
ConditionInterface
接口类,必须用它来标识这是一个表示查询条件的类
fromArrayDefinition()
方法,用来从数组格式创建查询条件yii\db\ExpressionBuilderInterface
接口和 build() 方法expressionBuilders
数组表达式对象和条件对象
yii\db\ExpressionInterface
接口,Expression Builder
)来执行构建逻辑yii\db\condition\ConditionInterface
接口,继承了 ExpressionInterface
接口AR 提供了一个面向对象的接口, 用以访问和操作数据库中的数据。
yii\db\ActiveRecord
{
{%TableName}}
表前缀,SQL查询引用处理tableName()
方法默认返回的表名称是通过类名转换而来yii\db\ActiveRecord
继承了模型 yii\base\Model
,具有属性,验证,数据序列化等等模型特性库连接
Active Record
默认使用 db 组件 作为连接器getDb()
方法Active Query
查询数据流程
yii\db\ActiveRecord::find()
方法创建一个新的查询生成器对象
yii\db\ActiveQuery
对象Active Record
实例中yii\db\ActiveQuery
查询方法
yii\db\ActiveQuery
继承 yii\db\Query
findOne(),findAll()
返回一个 Active Record
实例的数据,填充于查询结果数据
limit(1)
yii\db\ActiveRecord::findBySql()
书写原生的 SQL 语句查询数据在查询方法前调用 asArray()
方法, 以数组形式获取数据
批处理查询获取数据
Customer::find()->batch(10)
每次返回最多拥有 10 条数据的数组Customer::find()->each(10)
返回Customer
对象Customer::find()->with('orders')->each()
Customer
对象,并附带关联的 'orders'
save 方法保存数据(Saving Data)
Active Record
实例的 isNewRecord
属性值来区分这两个状态(插入或更新数据)insert(), update()
方法数据验证
rules()
方法声明验证规则并执行, 通过调用 validate()
方法进行数据验证save()
时,默认情况下会自动调用 validate()
,若可信可以 save(false)
来跳过验证过程块赋值,仅支持安全属性
更新一个或多个计数列 updateCounters()
脏属性 Dirty Attributes
yii\db\ActiveRecord::getDirtyAttributes()
获取当前的脏属性yii\db\ActiveRecord::markAttributeDirty()
将属性显式标记为脏默认属性值 loadDefaultValues()
来填充 DB 定义的默认值
属性类型转换
更新多个数据行 updateAll()
删除数据 delete(),deleteAll()
Active Record
的生命周期
afterFind()
:触发 EVENT_AFTER_FIND
事件beforeValidate()
触发 EVENT_BEFORE_VALIDATE
事件,返回false则后续步骤跳过
yii\base\ModelEvent::$isValid
值afterValidate()
触发 EVENT_AFTER_VALIDATE
事件beforeSave()
触发 EVENT_BEFORE_INSERT
或者 EVENT_BEFORE_UPDATE
事件,返回false同1afterSave()
触发 EVENT_AFTER_INSERT
或者 EVENT_AFTER_UPDATE
事件beforeDelete()
触发 EVENT_BEFORE_DELETE
事件afterDelete()
触发 EVENT_AFTER_DELETE
事件以下非基于 Active Record 模型的方法调用,不会启动上述任何的生命周期
yii\db\ActiveRecord::updateAll()
yii\db\ActiveRecord::deleteAll()
yii\db\ActiveRecord::updateCounters()
yii\db\ActiveRecord::updateCounters()
Active Record
的各个方法调用yii\db\ActiveRecord::transactions()
方法中列出需要事务支持的 DB 操作
OP_INSERT,OP_UPDATE,OP_DELETE
, OP_ALL
,使用 | 运算符连接上述常量来表明多个操作beforeSave()
方法时开启, 在调用 afterSave()
方法时被提交yii\db\ActiveRecord::update()
或者删除 yii\db\ActiveRecord::delete()
已经存在的单条数据行Active Record
类相关联的 DB
表中创建一个列,以存储每行的版本号yii\db\ActiveRecord::optimisticLock()
方法返回这个列的命名Model
类里实现 OptimisticLockBehavior
行为,从请求参数里自动解析这个列的值
version
属性,因为 OptimisticLockBehavior
已经处理它了.Active Record
更新数据的控制器动作中,要捕获(try/catch) yii\db\StaleObjectException
异常Active Record
类中定义关联关系,为每个需要定义关联关系声明一个关联方法hasMany()
或者 hasOne()
指定Active Record
类名, 用来指定为 hasMany()
或者 hasOne()
方法的第一个参数$this->hasOne(Customer::className(), ['id' => 'customer_id'])
id
为 Customer
模型列,customer_id
为当前模型列$customer->orders;
获得 Order
对象的数组$customer->getOrders()
返回 ActiveQuery 类的实例yii\db\ActiveQuery
活动 查询生成器的实例
yii\db\ActiveRecord Active Record
实例via()
(两个关联方法时使用) 或 viaTable()
(声明一个关联方法) 方法指定中间表via()
方法,可以通过多个表来定义关联声明yii\db\ActiveQuery::with()
方法,支持多关联关系及嵌套关联关系即时加载
Customer::find()->with(['orders.items','country'])->all()
$query
参数
yii\db\ActiveQuery
对象在即时加载的关联中调用 select() 方法时,要确保 在关联声明中引用的列(即外键,主键列)必须被 select!!!
yii\db\ActiveQuery::joinWith()
来利用已存在的关联声明joinWith()
会使用 LEFT JOIN
去连接主表和关联表, 会默认 即时加载 相应的关联数据$query->joinWith(['orders o'])
与下述代码等价 $query->joinWith([
'orders' => function ($q) {
$q->from(['o' => Order::tableName()]);
},
])
inverseOf()
方法声明 反向关联via()
或 viaTable()
反向关联不能使用link()
方法需要指定关联名 和要建立关联的目标 Active Record
实例unlink()
, 可断掉两个 active record
实例间已经存在的关联关系
Active Record
类之间声明关联关系yii\db\ActiveRecord::find()
方法并返回一个自定义查询类的实例yii\db\ActiveQuery
类,用纳容纳大多数与查询相关的代码,使ctive Record 类保持简洁百度知道贴过来的1)/etc/sysconfig/clock 文件,只对 hwclock 命令有效,且只在系统启动和关闭的时候才有用(修改了其中的 UTC=true 到 UTC=false 的前后,执行 hwclock (--utc, 或 --localtime) 都没有变化,要重启系统后才生效);在 /etc/sysconfig/clock 中 UTC=false 时,date、hwcloc
错误:android 编译时make[5]: arm-eabi-gcc: Command not found在 buliding preloader.... 的时候出错了,查看log提示 make[5]: arm-eabi-gcc: Command not found意思是说找不到这个编译工具。可能是路径没有配置好。解决办法:在 ~/.bashrc 文件中配置编译工具 arm-e
1.首先获取百度 JavaScriptAPI首先用浏览器打开http://api.map.baidu.com/api?v=1.3如下图所示其中http://api.map.baidu.com/getscript?v=1.3&key=&services=&t=20121108061854这个链接就是我们要找的API文件,同样在浏览器中打开它...
ActivityThread在Android中它就代表了Android的主线程,但是并不是一个Thread类。严格来说,UI主线程不是ActivityThread。ActivityThread类是Android APP进程的初始类,它的main函数是这个APP进程的入口。APP进程中UI事件的执行代码段都是由ActivityThread提供的。也就是说,Main Thread实例是存在的,只是创建...
《以局部优先的方法发现分层和重叠的社区》,这篇论文是导师给我,让我看一下,实现一下里面的算法,但是发现在作者的个人网站上已经有实现的版本了(传送),所以就整理一下论文思路就好了。首先还是翻译一下Abstract和Instruction两部分。论文标题:Uncovering Hierarchical and Overlapping Communities with a Local-First A...
● 创建一个新组stuff,要求组id为1010.● 查看/etc/group文件的最后一行,看看是如何设置的。● 创建新用户user1,user2,默认设置● 查看/etc/group文件的最后3行,得到什么结论● 创建一个新用户user3,并把他的基本组和附加组都设为stuff● 查看/etc/group文件中的最后5行,看看有什么变化。是否存在user3组?● 把user1加入stuff组● 查看一下/etc/group文件中stuff组成员列表是否有变化,/etc/passwd
rem(fontsizeoftherootelement)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位,em(fontsizeoftheelement)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。以下代码可以适配不同大小屏幕宽度。这种方式在浏览器中兼容性较差,但在...
在Eclipse中运行Tomcat发生OutOfMemoryError: PermGen space错误现象:Exception in thread "Keep-Alive-Timer" java.lang.OutOfMemoryError: PermGen space at java.util.AbstractList.subList(AbstractList.java:484
InkWell 、RaisedButton 等组件自带 splashColor 属性和 highlightColor 属性.将这两个属性设置为透明即可去除点击的效果.InkWell( onTap: () {}, child: Text('InkWell 组件'), highlightColor: Colors.transparent, // 透明色 splashColor: Colors.transparent, // 透明色),但是RaisedButton即使设置了 splas
题目本题要求实现一个函数,用下列公式求cos(x)的近似值,精确到最后一项的绝对值小于e:函数接口定义:double funcos( double e, double x );其中用户传入的参数为误差上限e和自变量x;函数funcos应返回用给定公式计算出来、并且满足误差要求的cos(x)的近似值。输入输出均在双精度范围内。裁判测试程序样例:#include <stdio.h>#include <math.h>double funcos( double e, do
Pace.js 官网地址 : http://github.hubspot.com/pace/Pace.js 最大的好处就是可以实时监听页面数据的加在情况,并且可以自定义加载条的样式。Pace.js 的api :Pace.start:开始显示进度条,如果你不是使用AMD或者Browserify来加载模块的话,这个会默认执行。Pace.restart:进度条重新加载以及显示。Pace.stop:隐藏