Yii查询生成器(Query Builder)用法实例教程
本文为yii官网英文文档的翻译版本,主要介绍了Yii查询生成器(QueryBuilder)的用法。分享给大家供大家参考之用。具体如下:
首先,Yii的查询生成器提供了用面向对象的方式写SQL语句。它允许开发人员使用类的方法和属性来指定一个SQL语句的各个部分。然后,组装成一个有效的SQL语句,可以通过调用DAO数据访问对象的描述方法为进一步执行。以下显示了一个典型的使用查询生成器建立一个select语句:
$user=Yii::app()->db->createCommand() ->select('id,username,profile') ->from('tbl_useru') ->join('tbl_profilep','u.id=p.user_id') ->where('id=:id',array(':id'=>$id)) ->queryRow();
当你在应用程序中需要组装SQL语句的程序,或基于一些条件逻辑时,最好使用查询生成器。使用查询生成器的好处主要包括:
①.它可以建立复杂的SQL语句编程。
②.它会自引用表名和列名防止SQL保留字和特殊字符的冲突。
③.它还可以引用参数值和使用参数绑定,这有助于减少SQL注入攻击的风险。
④.它提供了一定程度的数据库抽象,简化了迁移到不同的数据库平台的成本。
它不强制使用查询生成器。事实上,如果你的查询是简单的,它是更容易和更快的直接写SQL语句。
注:查询生成器不能用于修改现有的查询指定为SQL语句。例如,下面的代码将不能工作:
$command=Yii::app()->db->createCommand('SELECT*FROMtbl_user'); //thefollowinglinewillNOTappendWHEREclausetotheaboveSQL $command->where('id=:id',array(':id'=>$id));
换句话说,不要混合使用普通的SQL和查询生成器。
1.制备查询生成器(PreparingQueryBuilder)
Yii的查询生成器是从CDbCommand提供主要数据库查询类,描述数据访问对象。
开始使用查询生成器,我们创造了CDbCommand的一个新实例,
$command=Yii::app()->db->createCommand();
我们使用Yii::app()->db来获得数据库连接,然后调用CDbConnection::createCommand()创建所需的命令实例。
请注意,将整个SQL语句放入createcommand(),叫做数据访问对象,我们需呀把设置它为空。这是因为我们将在下面的解释中使用查询生成器添加SQL语句的各个部分的方法。
2.建立数据检索查询(BuildingDataRetrievalQueries)
数据检索查询是指选择SQL语句。查询生成器提供了一套方法来建立一个SELECT语句的各个部分。因为所有这些方法返回CDbCommand的实例,我们可以使用方法链调用他们,如图所示,在本节开头的例子。
select(): 指定查询的选择部分 specifiestheSELECTpartofthequery
selectDistinct(): 指定查询不重复的选择部分 specifiestheSELECTpartofthequeryandturnsontheDISTINCTflag
from(): 指定查询的FROM specifiestheFROMpartofthequery
where(): 指定查询的WHERE specifiestheWHEREpartofthequery
andWhere(): 用and的方式添加到WHERE的条件中 appendsconditiontotheWHEREpartofthequerywithANDoperator
orWhere(): 用or的方式添加到WHERE的条件中 appendsconditiontotheWHEREpartofthequerywithORoperator
join(): 添加一个内部联接的查询片段 appendsaninnerjoinqueryfragment
leftJoin(): 追加一个左外连接查询片段 appendsaleftouterjoinqueryfragment
rightJoin(): 追加一个右外部联接查询片段 appendsarightouterjoinqueryfragment
crossJoin(): 追加一个交叉连接查询片段 appendsacrossjoinqueryfragment
naturalJoin(): 追加一个自然连接查询片段 appendsanaturaljoinqueryfragment
group(): 指定查询的GROUPBY specifiestheGROUPBYpartofthequery
having(): 指定查询的HAVING specifiestheHAVINGpartofthequery
order(): 指定查询的ORDERBY specifiestheORDERBYpartofthequery
limit(): 指定查询的LIMIT specifiestheLIMITpartofthequery
offset(): 指定查询的OFFSET specifiestheOFFSETpartofthequery
union(): 添加查询的UNION appendsaUNIONqueryfragment
在下面,我们将解释如何使用这些查询生成器方法。为简单起见,我们假设底层数据库是MySQL。注意:如果你使用的是其他数据库,表/列/值引用的例子可能是不同的。
select()
functionselect($columns='*')
该select()方法指定一个查询的选择部分。$columns参数指定要选择的列,它可以是一个字符串,用逗号分隔列,或者一个数组的列名称。列的名称可以包含表的前缀和/或列别名。该方法将自动引用列名,除非一列包含一些括号(这意味着这个列是一个DB的表达式)。
下面是一些例子:
//SELECT* select() //SELECT`id`,`username` select('id,username') //SELECT`tbl_user`.`id`,`username`AS`name` select('tbl_user.id,usernameasname') //SELECT`id`,`username` select(array('id','username')) //SELECT`id`,count(*)asnum select(array('id','count(*)asnum'))
selectDistinct()
functionselectDistinct($columns)
selectdistinct()方法类似于select(),除了它打开了DISTINCT的标志。例如,selectdistinct('id,用户名”)会产生以下SQL:
SELECTDISTINCT`id`,`username`
from()
functionfrom($tables)
from()方法指定来了一个查询的FROM部分。$tables参数指定表的选择。这可以是一个字符串,用逗号分隔的表的名称,或表名数组。表的名称可以包含架构前缀(例如公共。tbl_user)和/或表的别名(e.g.tbl_userU)。该方法将自动引用表的名称,除非它包含一些括号(即表是一个给定的子查询或DB的表达式)。
下面是一些例子:
//FROM`tbl_user` from('tbl_user') //FROM`tbl_user``u`,`public`.`tbl_profile``p` from('tbl_useru,public.tbl_profilep') //FROM`tbl_user`,`tbl_profile` from(array('tbl_user','tbl_profile')) //FROM`tbl_user`,(select*fromtbl_profile)p from(array('tbl_user','(select*fromtbl_profile)p'))
where()
functionwhere($conditions,$params=array())
where()方法指定查询的WHERE。$conditions参数指定查询条件的同时,$params指定参数绑定到整个查询。$conditions参数可以是一个字符串(例如id=1)或一个数组中的格式:
array(operator,operand1,operand2,...)
operator可以是以下的任何一个:
①.and:operands应该使用and连接在一起。例如,array('and','id=1','id=2')将产生id=1ANDid=2。如果一个操作数是一个数组,它将使用这里描述的相同规则转换成一个字符串。例如,array('and','type=1',array('or','id=1','id=2'))将生成type=1AND(id=1ORid=2)。
②.or:类似and操作,除了operands是使用OR连接的。
③.in:operand1应是一个列或DB表达式,而operand2是代表值的范围的数组,列或DB表达式应在这个数组的范围内。例如,array('in','id',array(1,2,3))将生成idIN(1,2,3)。
④.notin:类似in操作,除了用NOTIN代替IN 去生成SQL。
⑤.like:operand1应是一个列或DB表达式,而operand2是代表值的范围的数组,列或DB表达式应在这个数组的范围内。例如,array('like','name','%tester%')会生成nameLIKE'%tester%'。当规定值的范围为一个数组时,多个LIKE生成SQL时会用AND连接。例如,array('like','name',array('%test%','%sample%'))会生成nameLIKE'%test%'ANDnameLIKE'%sample%'。
⑥.notlike:类似like的操作,除了用NOTLIKE代替LIKE 去生成SQL。
⑦.orlike:类似like的操作,除了多个like生成SQL时用OR连接。
⑧.ornotlike: 类似notlike的操作,除了多个like生成SQL时用OR连接。
下面是一些例子,使用的地方:
//WHEREid=1orid=2 where('id=1orid=2') //WHEREid=:id1orid=:id2 where('id=:id1orid=:id2',array(':id1'=>1,':id2'=>2)) //WHEREid=1ORid=2 where(array('or','id=1','id=2')) //WHEREid=1AND(type=2ORtype=3) where(array('and','id=1',array('or','type=2','type=3'))) //WHERE`id`IN(1,2) where(array('in','id',array(1,2)) //WHERE`id`NOTIN(1,2) where(array('notin','id',array(1,2))) //WHERE`name`LIKE'%Qiang%' where(array('like','name','%Qiang%')) //WHERE`name`LIKE'%Qiang'AND`name`LIKE'%Xue' where(array('like','name',array('%Qiang','%Xue'))) //WHERE`name`LIKE'%Qiang'OR`name`LIKE'%Xue' where(array('orlike','name',array('%Qiang','%Xue'))) //WHERE`name`NOTLIKE'%Qiang%' where(array('notlike','name','%Qiang%')) //WHERE`name`NOTLIKE'%Qiang%'OR`name`NOTLIKE'%Xue%' where(array('ornotlike','name',array('%Qiang%','%Xue%')))
请注意,当操作者含有like时,我们必须明确指定的通配符(如%和_)的模式。如果参数是从用户的输入,我们也应该使用下面的代码转义特殊字符,以防止他们被当作通配符:
$keyword=$_GET['q']; //escape%and_characters $keyword=strtr($keyword,array('%'=>'\%','_'=>'\_')); $command->where(array('like','title','%'.$keyword.'%'));
andWhere()
functionandWhere($conditions,$params=array())
用and的方式添加到WHERE的条件中。此方法的行为几乎是where()相同,除了它只是添加条件不能取代它。在where()文档中有该方法参数的详细信息。
orWhere()
functionorWhere($conditions,$params=array())
用or的方式添加到WHERE的条件中。此方法的行为几乎是where()相同,除了它只是添加条件不能取代它。在where()文档中有该方法参数的详细信息。
order()
functionorder($columns)
order()方法指定查询的ORDERBY部分。$columns参数指定列进行排序,这可以是一个包含用逗号分隔列和order的方向(ASC或DESC)的字符串,或者一个列和order的方向的数组。列名称可以包含表前缀。该方法将自动引用列名,除非一列包含一些括号(即给出一个DB表达式)。
下面是一些例子:
//ORDERBY`name`,`id`DESC order('name,iddesc') //ORDERBY`tbl_profile`.`name`,`id`DESC order(array('tbl_profile.name','iddesc'))
limit()andoffset()
functionlimit($limit,$offset=null) functionoffset($offset)
limit()和offset()方法指定查询的LIMIT和OFFSET部分。请注意,某些DBMS不支持LIMIT和OFFSET语法。在这种情况下,查询生成器将改写整个SQL语句来模拟LIMIT和OFFSET的功能。
下面是一些例子:
//LIMIT10取前10条 limit(10) //LIMIT10OFFSET20取到第21~30条 limit(10,20) //OFFSET20去掉前20条后剩下的数据 offset(20)
join()anditsvariants
functionjoin($table,$conditions,$params=array()) functionleftJoin($table,$conditions,$params=array()) functionrightJoin($table,$conditions,$params=array()) functioncrossJoin($table) functionnaturalJoin($table)
join()方法及其变种指定如何与其他表连接,使用内部联接,左外连接,右外部联接,交叉连接,或自然连接。$table参数指定要加入哪个表。表名可以包含数据库的前缀和/或别名。该方法将引用表名,除非它包含一个插入语,即一个DB表达式或子查询。$conditions参数指定连接条件。它的语法与where()相同。$params参数指定绑定到整个查询的参数。
值得注意的是,它不像其他的查询生成器方法,每次调用一个join方法都会追加到SQL中。
下面是一些例子:
//JOIN`tbl_profile`ONuser_id=id join('tbl_profile','user_id=id') //LEFTJOIN`pub`.`tbl_profile``p`ONp.user_id=idANDtype=1 leftJoin('pub.tbl_profilep','p.user_id=idANDtype=:type',array(':type'=>1))
group()
functiongroup($columns)
group()方法指定查询的GROUPBY。$columns参数指定列进行分组,它可以是一个用逗号分隔的列的字符串,或者一个列的数组。列名称可以包含表前缀。该方法将自动引用列名,除非一列包含一些括号(即是一个DB表达式)。
下面是一些例子:
//GROUPBY`name`,`id` group('name,id') //GROUPBY`tbl_profile`.`name`,`id` group(array('tbl_profile.name','id'))
having()
functionhaving($conditions,$params=array())
having()方法指定查询的HAVING。它的使用方式与where()相同。
下面是一些例子:
//HAVINGid=1orid=2 having('id=1orid=2') //HAVINGid=1ORid=2 having(array('or','id=1','id=2'))
union()
functionunion($sql)
union()方法指定查询UNION。它使用UNION操作附加到现有的SQL上。调用union()多次将现有的SQL附加多个表。
下面是一些例子:
//UNION(select*fromtbl_profile) union('select*fromtbl_profile')
执行查询(ExecutingQueries)
调用上面查询生成器的方法来建立一个查询后,我们可以调用DAO方法数据访问对象执行查询。例如,我们可以调用CDbCommand::queryRow()获得连续的结果,或者使用CDbCommand::queryAll()立刻得到所有行。
例子:
$users=Yii::app()->db->createCommand() ->select('*') ->from('tbl_user') ->queryAll();
检索表(RetrievingSQLs)
除了执行查询生成器的查询,我们也可以获取相应的SQL语句。这可以通过调用CDbCommand::getText()获得。
$sql=Yii::app()->db->createCommand() ->select('*') ->from('tbl_user') ->text;
如果有任何参数必须绑定到查询的,他们可以通过CDbCommand::params的属性绑定。
建立查询的替代语法(AlternativeSyntaxforBuildingQueries)
有时,使用方法链来建立一个查询可能不是最佳的选择。Yii的查询生成器允许使用对简单象属性赋值的方式去建立查询。特别是,每个查询生成器的方法都有一个具有相同名称的属性。给属性赋值相当于调用相应的方法。例如,下面两个语句是等价的,假设$command代表CDbCommand对象:
$command->select(array('id','username')); $command->select=array('id','username');
此外,CDbConnection::createCommand()方法可以把一个数组作为参数。数组中的键值对将被用来初始化创建的CDbCommand实例的属性。这意味着,我们可以使用下面的代码来建立一个查询:
$row=Yii::app()->db->createCommand(array( 'select'=>array('id','username'), 'from'=>'tbl_user', 'where'=>'id=:id', 'params'=>array(':id'=>1), ))->queryRow();
建立多个查询(BuildingMultipleQueries)
一个CDbCommand实例可以重复使用多次建立几个查询。建立一个新的查询之前,需要调用CDbCommand::reset()方法以清理前面的查询。例子:
$command=Yii::app()->db->createCommand(); $users=$command->select('*')->from('tbl_users')->queryAll(); $command->reset();//cleanupthepreviousquery $posts=$command->select('*')->from('tbl_posts')->queryAll();
3.建立数据操作查询(BuildingDataManipulationQueries)
数据操作查询是指SQL语句插入,更新和删除数据库表中的数据。对应于这些查询,查询生成器分别提供了插入,更新和删除的方法。不同于上面介绍SELECT的查询方法,这些数据操作查询方法将建立一个完整的SQL语句,并立即执行。
insert():将行插入到表
update():更新表中的数据
delete():从表中删除数据
下面描述了这些数据操作查询方法。
insert()
functioninsert($table,$columns)
insert()方法的建立和执行一条INSERTSQL语句。$table参数指定要插入的表,而键值对数组$columns指定要插入的列的值。该方法将转义表名,并且将与绑定参数结合使用。
下面是一个例子:
//buildandexecutethefollowingSQL: //INSERTINTO`tbl_user`(`name`,`email`)VALUES(:name,:email) $command->insert('tbl_user',array( 'name'=>'Tester', 'email'=>'tester@example.com', ));
update()
functionupdate($table,$columns,$conditions='',$params=array())
update()方法的建立和执行一个SQL更新语句。$table参数指定要更新的表;$columns是键值对的数组,用于指定要更新的列值的;$conditions和$params像where()一样,指定UPDATE语句中的WHERE子句。该方法将转义表名,并且将与要更新的值的参数结合使用。
下面是一个例子:
//buildandexecutethefollowingSQL: //UPDATE`tbl_user`SET`name`=:nameWHEREid=:id $command->update('tbl_user',array( 'name'=>'Tester', ),'id=:id',array(':id'=>1));
delete()
functiondelete($table,$conditions='',$params=array())
delete()方法的建立和执行一个SQL删除语句。$table参数指定要删除数据的表;$conditions和$params像where()一样,指定DELETE语句中的WHERE子句。该方法将正确转义表名。
下面是一个例子:
//buildandexecutethefollowingSQL: //DELETEFROM`tbl_user`WHEREid=:id $command->delete('tbl_user','id=:id',array(':id'=>1));
4.建立架构操作查询(BuildingSchemaManipulationQueries)
除了正常的数据检索和操作查询,查询生成器提供了一套用于可以操纵数据库的构建和执行SQL查询的方法。它支持以下操作:
createTable():创建一个表
renameTable():重命名表
dropTable():删除一个表
truncateTable():截断一个表,即删除表中的所有数据但不删除表本身
addColumn():给表添加列
renameColumn():重命名表中的列
alterColumn():改变一个表的列
addForeignKey():添加一个外键(自1.1.6可用)
dropForeignKey():删除一个外键(自1.1.6可用)
dropColumn():删除一个表的列
createIndex():创建一个索引
dropIndex():删除一个索引
Info:虽然在不同的数据库管理系统中SQL语句操作数据库的模式有很大的不同,但查询生成器试图提供一个统一的接口,用于构建这些查询。这简化了数据库迁移从一个数据库管理系统到另一个任务。
抽象数据类型AbstractDataTypes
查询生成器中引入了一组可以在定义表的列中使用抽象数据类型。与物理数据类型不同,物理数据类型有具体独特的DBMS而且在不同的DBMS中有很大的不同,抽象数据类型都是独立的DBMS。当抽象数据类型在定义表的列中使用时,查询生成器将其转换成相应的物理数据类型。
下面的抽象数据类型由查询生成器的支持。
pk:一个通用的主键类型,将被转换成int(11)NOTNULLAUTO_INCREMENTPRIMARYKEYforMySQL;
string:字符串类型,将被转换成varchar(255)forMySQL;
text:文本型(长字符串),将被转换成textforMySQL;
integer:整数类型,将被转换成int(11)forMySQL;
float:浮点数类型,将被转换成floatforMySQL;
decimal:十进制数类型,将被转换成decimalforMySQL;
datetime:datetime类型,将被转换成datetimeforMySQL;
timestamp:时间戳类型,将被转换成timestampforMySQL;
time:时间类型,将被转换成timeforMySQL;
date:日期类型,将被转换成dateforMySQL;
binary:二进制数据类型,将被转换成blobforMySQL;
boolean:布尔类型,将被转换成tinyint(1)forMySQL;
money:金钱/货币型,将被转换成decimal(19,4)forMySQL.自1.1.8版本开始此类型可以使用。
createTable()
functioncreateTable($table,$columns,$options=null)
createTable()方法构建和执行一条创建表的SQL语句。$table参数指定要创建的表的名称。$columns参数指定在新表中的列。他们必须被指定为名称类型的键值对(e.g.'username'=>'string')。$options参数指定应附加到生成的SQL上的任何额外的SQL片段。查询生成器将正确的引用的表名以及列名。
当指定一个列的定义时,可以使用如上所述的抽象数据类型。查询生成器会根据当前使用的数据库管理系统的抽象数据类型转换成相应的物理数据类型。例如,string类型将被转换为MySQL的varchar(255)。
一个列定义还可以包含非抽象数据类型或规格。他们将没有任何改变的被放置在生成的SQL中。例如,point不是一个抽象数据类型,如果用在列定义,它会出现在生成的SQL中,而且stringNOTNULL将被转换varchar(255)NOTNULL(即只有抽象类型的字符串转换)。
下面是一个例子,显示了如何创建一个表:
//CREATETABLE`tbl_user`( //`id`int(11)NOTNULLAUTO_INCREMENTPRIMARYKEY, //`username`varchar(255)NOTNULL, //`location`point //)ENGINE=InnoDB createTable('tbl_user',array( 'id'=>'pk', 'username'=>'stringNOTNULL', 'location'=>'point', ),'ENGINE=InnoDB')
renameTable()
functionrenameTable($table,$newName)
renameTable()方法创建和执行一条重命名表名的SQL语句。$table参数指定要重命名的表的名称。$newName参数指定表的新名称。查询生成器将正确引用的表名。
下面是一个示例,演示了如何重命名表:
//RENAMETABLE`tbl_users`TO`tbl_user` renameTable('tbl_users','tbl_user')
dropTable()
functiondropTable($table)
dropTable()方法创建和执行一条删除表的SQL语句。在$table参数指定要删除的表的名称。查询生成器会正确地引用的表名。
下面是一个示例展示如何删除一个表:
//DROPTABLE`tbl_user` dropTable('tbl_user')
truncateTable()
functiontruncateTable($table)
truncateTable()方法建立和执行一条清空表数据的SQL语句。$table参数指定清空的表名。查询生成器会正确地引用的表名。
下面是一个示例显示如何清空表:
//TRUNCATETABLE`tbl_user` truncateTable('tbl_user')
addColumn()
functionaddColumn($table,$column,$type)
addColumn()方法创建并执行一条添加一个表的新列的SQL语句。$table参数指定新列将被添加到的表的名称。$column参数指定新列的名称。$type指定新列的定义。列定义中可以包含抽象数据类型,如"createTable"小节中的描述。查询生成器将正确的引用的表名以及列名。
下面是一个示例,演示如何添加一个表的列:
//ALTERTABLE`tbl_user`ADD`email`varchar(255)NOTNULL addColumn('tbl_user','email','stringNOTNULL')
dropColumn()
functiondropColumn($table,$column)
dropColumn()方法创建和执行一条删除表列的SQL语句。$table参数指定要被删除的列所属的表名。$column参数指定要被删除的列名。查询生成器将正确地引用的表名以及列名。
下面是一个示例展示如何删除一个表列:
//ALTERTABLE`tbl_user`DROPCOLUMN`location` dropColumn('tbl_user','location')
renameColumn()
functionrenameColumn($table,$name,$newName)
renameColumn()方法创建和执行一条重命名列的SQL语句。$table参数指定要重命名的列所属的表的名称。$name参数指定的旧列名。$newName指定新的列名。查询生成器将正确地引用的表名以及列名。
下面是一个示例,展示了如何重命名表列:
//ALTERTABLE`tbl_users`CHANGE`name``username`varchar(255)NOTNULL renameColumn('tbl_user','name','username')
alterColumn()
functionalterColumn($table,$column,$type)
alterColumn()方法创建和执行一条修改表列的SQL语句。$table参数指定要被改变的列所属的表的名称。$column参数指定被改变的列的名称。$type指定列的新定义。列定义中可以包含抽象数据类型,如"createTable"小节中的描述。查询生成器将正确的引用的表名以及列名。
下面是一个示例,展示了如何更改一个表列:
//ALTERTABLE`tbl_user`CHANGE`username``username`varchar(255)NOTNULL alterColumn('tbl_user','username','stringNOTNULL')
addForeignKey()
functionaddForeignKey($name,$table,$columns,$refTable,$refColumns,$delete=null,$update=null)
addForeignKey()方法创建和执行一条添加一个外键约束SQL语句。$name参数指定外键的名称。$table和$columns参数指定外键的表名和列名。如果有多个列,他们应该用逗号字符分隔。$refTable和$refColumns参数指定表名和列名的外键引用。$delete和$update参数指定SQL语句中的ONDELETE和ONUPDATE选项。大多数的DBMS都支持这些选项:RESTRICT,CASCADE,NOACTION,SETDEFAULT,SETNULL.。查询生成器会正确地引用表名,索引名和列名。
下面是一个示例,演示如何添加一个外键约束:
//ALTERTABLE`tbl_profile`ADDCONSTRAINT`fk_profile_user_id` //FOREIGNKEY(`user_id`)REFERENCES`tbl_user`(`id`) //ONDELETECASCADEONUPDATECASCADE addForeignKey('fk_profile_user_id','tbl_profile','user_id','tbl_user','id','CASCADE','CASCADE')
dropForeignKey()
functiondropForeignKey($name,$table)
dropForeignKey()方法创建和执行一条删除一个外键约束的SQL语句。$name参数指定的要删除的外键约束的名称。$table参数指定外键所属的表的名称。查询生成器将正确地引用的表名以及约束名称。
下面是一个示例,显示了如何删除外键约束:
//ALTERTABLE`tbl_profile`DROPFOREIGNKEY`fk_profile_user_id` dropForeignKey('fk_profile_user_id','tbl_profile')
createIndex()
functioncreateIndex($name,$table,$column,$unique=false)
createIndex()方法构建和执行一条创建索引的SQL语句。$name参数指定要创建的索引的名称。$table参数指定索引所属的表的名称。$column参数指定要索引的列的名称。$unique参数指定是否创建一个唯一索引。如果索引由多个列,则必须用逗号将它们隔开。查询生成器会正确地引用表名,索引名和列名。
下面是一个示例,显示了如何创建索引:
//CREATEINDEX`idx_username`ON`tbl_user`(`username`) createIndex('idx_username','tbl_user','username')
dropIndex()
functiondropIndex($name,$table)
dropIndex()方法创建和执行一条删除索引的SQL语句。$name参数指定要删除的索引的名称。$table参数指定索引所属的表的名称。查询生成器将正确地引用的表名以及索引名称。
下面是一个示例,显示了如何删除索引:
//DROPINDEX`idx_username`ON`tbl_user` dropIndex('idx_username','tbl_user')
希望本文所述对大家yii学习有所帮助。