首頁 > 後端開發 > php教程 > Yii查詢產生器(Query Builder)用法實例教學

Yii查詢產生器(Query Builder)用法實例教學

高洛峰
發布: 2023-03-05 07:56:01
原創
1430 人瀏覽過

本文為yii官網英文文件的翻譯版本,主要介紹了Yii查詢產生器(Query Builder)的用法。分享給大家參考之用。具體如下:

首先,Yii的查詢產生器提供了以物件導向的方式寫SQL語句。它允許開發人員使用類別的方法和屬性來指定一個SQL語句的各個部分。然後,組裝成一個有效的SQL語句,可以透過呼叫DAO資料存取物件的描述方法為進一步執行。以下顯示了一個典型的使用查詢產生器建立一個select語句:

$user = Yii::app()->db->createCommand()
  ->select('id, username, profile')
  ->from('tbl_user u')
  ->join('tbl_profile p', 'u.id=p.user_id')
  ->where('id=:id', array(':id'=>$id))
  ->queryRow();
登入後複製

當你在應用程式中需要組裝SQL語句的程序,或基於一些條件邏輯時,最好使用查詢產生器。使用查詢產生器的好處主要包括:

①.它可以建立複雜的SQL語句程式設計。

②.它會自引用表名和列名防止SQL保留字和特殊字元的衝突。

③.它還可以引用參數值和使用參數綁定,這有助於減少SQL注入攻擊的風險。

④.它提供了一定程度的資料庫抽象,簡化了遷移到不同的資料庫平台的成本。

它不強制使用查詢產生器。事實上,如果你的查詢是簡單的,它是更容易且更快的直接寫SQL語句。

註:查詢產生器不能用來修改現有的查詢指定為SQL語句。例如,下面的程式碼將無法運作:

$command = Yii::app()->db->createCommand('SELECT * FROM tbl_user');
// the following line will NOT append WHERE clause to the above SQL
$command->where('id=:id', array(':id'=>$id));
登入後複製

換句話說,不要混合使用普通的SQL和查詢產生器。

1. 製備查詢產生器(Preparing Query Builder)

Yii的查詢產生器是從 CDbCommand 提供主要資料庫查詢類,描述資料存取物件。

開始使用查詢產生器,我們創造了CDbCommand 的一個新實例,

$command = Yii::app()->db->createCommand();
登入後複製

我們使用Yii::app()->db 來獲得資料庫連接,然後呼叫CDbConnection::createCommand() 建立所需的命令實例。

請注意,將整個SQL語句放入 createcommand() ,叫做資料存取對象,我們需呀把設定它為空。這是因為我們將在下面的解釋中使用查詢產生器來新增SQL語句的各個部分的方法。

2. 建立資料擷取查詢(Building Data Retrieval Queries)

資料擷取查詢是指選擇SQL語句。查詢產生器提供了一套方法來建立一個SELECT語句的各個部分。因為所有這些方法都傳回 CDbCommand 的實例,我們可以使用方法鏈來呼叫他們,如圖所示,在本節開頭的範例。

select(): 指定查询的选择部分 specifies the SELECT part of the query
selectDistinct(): 指定查询不重复的选择部分 specifies the SELECT part of the query and turns on the DISTINCT flag
from(): 指定查询的FROM specifies the FROM part of the query
where(): 指定查询的WHERE specifies the WHERE part of the query
andWhere(): 用and的方式添加到WHERE的条件中 appends condition to the WHERE part of the query with AND operator
orWhere(): 用or的方式添加到WHERE的条件中 appends condition to the WHERE part of the query with OR operator
join(): 添加一个内部联接的查询片段 appends an inner join query fragment
leftJoin(): 追加一个左外连接查询片段 appends a left outer join query fragment
rightJoin(): 追加一个右外部联接查询片段 appends a right outer join query fragment
crossJoin(): 追加一个交叉连接查询片段 appends a cross join query fragment
naturalJoin(): 追加一个自然连接查询片段 appends a natural join query fragment
group(): 指定查询的GROUP BY specifies the GROUP BY part of the query
having(): 指定查询的HAVING specifies the HAVING part of the query
order(): 指定查询的ORDER BY specifies the ORDER BY part of the query
limit(): 指定查询的LIMIT specifies the LIMIT part of the query
offset(): 指定查询的OFFSET specifies the OFFSET part of the query
union(): 添加查询的UNION appends a UNION query fragment

在下面,我们将解释如何使用这些查询生成器方法。为简单起见,我们假设底层数据库是MySQL。注意:如果你使用的是其他数据库,表/列/值引用的例子可能是不同的。

select()

function select($columns='*')
登入後複製

该select()方法指定一个查询的选择部分。$columns参数指定要选择的列,它可以是一个字符串,用逗号分隔列,或者一个数组的列名称。列的名称可以包含表的前缀和 / 或列别名。该方法将自动引用列名,除非一列包含一些括号(这意味着这个列是一个DB的表达式)。

下面是一些例子:

// SELECT *
select()
// SELECT `id`, `username`
select('id, username')
// SELECT `tbl_user`.`id`, `username` AS `name`
select('tbl_user.id, username as name')
// SELECT `id`, `username`
select(array('id', 'username'))
// SELECT `id`, count(*) as num
select(array('id', 'count(*) as num'))
登入後複製

selectDistinct()

function selectDistinct($columns)
登入後複製

selectdistinct()方法类似于select(),除了它打开了 DISTINCT 的标志。例如,selectdistinct('id,用户名”)会产生以下SQL:

SELECT DISTINCT `id`, `username`
登入後複製

from()

function from($tables)
登入後複製

from()方法指定来了一个查询的FROM部分。 $tables 参数指定表的选择。这可以是一个字符串,用逗号分隔的表的名称,或表名数组。表的名称可以包含架构前缀(例如公共。tbl_user)和/或表的别名(e.g.tbl_user U)。该方法将自动引用表的名称,除非它包含一些括号(即表是一个给定的子查询或DB的表达式)。

下面是一些例子:

// FROM `tbl_user`
from('tbl_user')
// FROM `tbl_user` `u`, `public`.`tbl_profile` `p`
from('tbl_user u, public.tbl_profile p')
// FROM `tbl_user`, `tbl_profile`
from(array('tbl_user', 'tbl_profile'))
// FROM `tbl_user`, (select * from tbl_profile) p
from(array('tbl_user', '(select * from tbl_profile) p'))
登入後複製

where()

function where($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=1 AND id=2 。如果一个操作数是一个数组,它将使用这里描述的相同规则转换成一个字符串。例如,array('and', 'type=1', array('or', 'id=1', 'id=2')) 将生成 type=1 AND (id=1 OR id=2)。

②.or: 类似 and 操作,除了operands 是使用 OR 连接的。

③.in: operand 1 应是一个列或 DB 表达式,而 operand 2 是代表值的范围的数组,列或 DB 表达式应在这个数组的范围内。例如,array('in', 'id', array(1,2,3)) 将生成 id IN (1,2,3)。

④.not in: 类似 in 操作,除了用 NOT IN 代替 IN 去生成SQL。

⑤.like: operand 1 应是一个列或 DB 表达式,而 operand 2 是代表值的范围的数组,列或 DB 表达式应在这个数组的范围内。例如,array('like', 'name', '%tester%') 会生成 name LIKE '%tester%'。当规定值的范围为一个数组时,多个 LIKE 生成SQL时会用 AND 连接。例如,array('like', 'name', array('%test%', '%sample%')) 会生成 name LIKE '%test%' AND name LIKE '%sample%'。

⑥.not like: 类似 like 的操作,除了用 NOT LIKE 代替 LIKE 去生成SQL。

⑦.or like: 类似 like 的操作,除了多个 like 生成 SQL 时用OR连接。

⑧.or not like: 类似 not like 的操作,除了多个 like 生成 SQL 时用OR连接。

下面是一些例子,使用的地方:

// WHERE id=1 or id=2
where('id=1 or id=2')
// WHERE id=:id1 or id=:id2
where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2))
// WHERE id=1 OR id=2
where(array('or', 'id=1', 'id=2'))
// WHERE id=1 AND (type=2 OR type=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` NOT IN (1, 2)
where(array('not in', '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('or like', 'name', array('%Qiang', '%Xue')))
// WHERE `name` NOT LIKE '%Qiang%'
where(array('not like', 'name', '%Qiang%'))
// WHERE `name` NOT LIKE '%Qiang%' OR `name` NOT LIKE '%Xue%'
where(array('or not like', 'name', array('%Qiang%', '%Xue%')))
登入後複製

请注意,当操作者含有like时,我们必须明确指定的通配符(如%和_)的模式。如果参数是从用户的输入,我们也应该使用下面的代码转义特殊字符,以防止他们被当作通配符:

$keyword=$_GET['q'];
// escape % and _ characters
$keyword=strtr($keyword, array('%'=>'\%', '_'=>'\_'));
$command->where(array('like', 'title', '%'.$keyword.'%'));
登入後複製

andWhere()

function andWhere($conditions, $params=array())
登入後複製

用and 的方式添加到WHERE的条件中。此方法的行为几乎是 where() 相同,除了它只是添加条件不能取代它。在 where() 文档中有该方法参数的详细信息。

orWhere()

function orWhere($conditions, $params=array())
登入後複製

用 or 的方式添加到WHERE的条件中。此方法的行为几乎是 where() 相同,除了它只是添加条件不能取代它。在 where() 文档中有该方法参数的详细信息。

order()

function order($columns)
登入後複製

order() 方法指定查询的ORDER BY部分。$columns 参数指定列进行排序,这可以是一个包含用逗号分隔列和order的方向(ASC 或 DESC)的字符串,或者一个列和order的方向的数组。列名称可以包含表前缀。该方法将自动引用列名,除非一列包含一些括号(即给出一个 DB 表达式)。

下面是一些例子:

// ORDER BY `name`, `id` DESC
order('name, id desc')
// ORDER BY `tbl_profile`.`name`, `id` DESC
order(array('tbl_profile.name', 'id desc'))
登入後複製

limit() and offset()

function limit($limit, $offset=null)
function offset($offset)
登入後複製

limit()和offset()方法指定查询的 LIMIT 和 OFFSET 部分。请注意,某些DBMS不支持 LIMIT 和 OFFSET 语法。在这种情况下,查询生成器将改写整个SQL语句来模拟 LIMIT 和 OFFSET 的功能。

下面是一些例子:

// LIMIT 10  取前10条
limit(10)
// LIMIT 10 OFFSET 20  取到第21~30条
limit(10, 20)
// OFFSET 20  去掉前20条后剩下的数据
offset(20)
登入後複製

join() and its variants

function join($table, $conditions, $params=array())
function leftJoin($table, $conditions, $params=array())
function rightJoin($table, $conditions, $params=array())
function crossJoin($table)
function naturalJoin($table)
登入後複製

join()方法及其变种指定如何与其他表连接,使用内部联接,左外连接,右外部联接,交叉连接,或自然连接。 $table 参数指定要加入哪个表。表名可以包含数据库的前缀和 / 或别名。该方法将引用表名,除非它包含一个插入语,即一个DB表达式或子查询。 $conditions 参数指定连接条件。它的语法与where() 相同。$params 参数指定绑定到整个查询的参数。

值得注意的是,它不像其他的查询生成器方法,每次调用一个join方法都会追加到SQL中。

下面是一些例子:

// JOIN `tbl_profile` ON user_id=id
join('tbl_profile', 'user_id=id')
// LEFT JOIN `pub`.`tbl_profile` `p` ON p.user_id=id AND type=1
leftJoin('pub.tbl_profile p', 'p.user_id=id AND type=:type', array(':type'=>1))
登入後複製

group()

function group($columns)
登入後複製

group() 方法指定查询的GROUP BY。 $columns 参数指定列进行分组,它可以是一个用逗号分隔的列的字符串,或者一个列的数组。列名称可以包含表前缀。该方法将自动引用列名,除非一列包含一些括号(即是一个 DB 表达式)。

下面是一些例子:

// GROUP BY `name`, `id`
group('name, id')
// GROUP BY `tbl_profile`.`name`, `id`
group(array('tbl_profile.name', 'id'))
登入後複製

having()

function having($conditions, $params=array())
登入後複製

having() 方法指定查询的 HAVING。它的使用方式与 where() 相同。

下面是一些例子:

// HAVING id=1 or id=2
having('id=1 or id=2')
// HAVING id=1 OR id=2
having(array('or', 'id=1', 'id=2'))
登入後複製

union()

function union($sql)
登入後複製

union() 方法指定查询 UNION。它使用UNION操作附加到现有的SQL上。调用union()多次将现有的SQL附加多个表。

下面是一些例子:

// UNION (select * from tbl_profile)
union('select * from tbl_profile')
登入後複製

执行查询(Executing Queries)

调用上面查询生成器的方法来建立一个查询后,我们可以调用DAO方法数据访问对象执行查询。例如,我们可以调用 CDbCommand::queryRow() 获得连续的结果,或者使用 CDbCommand::queryAll() 立刻得到所有行。

例子:

$users = Yii::app()->db->createCommand()
  ->select('*')
  ->from('tbl_user')
  ->queryAll();
登入後複製

检索表(Retrieving SQLs)

除了执行查询生成器的查询,我们也可以获取相应的SQL语句。这可以通过调用 CDbCommand::getText() 获得。

$sql = Yii::app()->db->createCommand()
  ->select('*')
  ->from('tbl_user')
  ->text;
登入後複製

如果有任何参数必须绑定到查询的,他们可以通过 CDbCommand::params 的属性绑定。

建立查询的替代语法(Alternative Syntax for Building Queries)

有时,使用方法链来建立一个查询可能不是最佳的选择。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();
登入後複製

建立多个查询(Building Multiple Queries)

一个 CDbCommand 实例可以重复使用多次建立几个查询。建立一个新的查询之前,需要调用 CDbCommand::reset() 方法以清理前面的查询。例子:

$command = Yii::app()->db->createCommand();
$users = $command->select('*')->from('tbl_users')->queryAll();
$command->reset(); // clean up the previous query
$posts = $command->select('*')->from('tbl_posts')->queryAll();
登入後複製

3. 建立数据操作查询(Building Data Manipulation Queries)

数据操作查询是指SQL语句插入,更新和删除数据库表中的数据。对应于这些查询,查询生成器分别提供了插入,更新和删除的方法。不同于上面介绍 SELECT 的查询方法,这些数据操作查询方法将建立一个完整的SQL语句,并立即执行。

insert(): 将行插入到表
update(): 更新表中的数据
delete(): 从表中删除数据
下面描述了这些数据操作查询方法。

insert()

function insert($table, $columns)
登入後複製

insert()方法的建立和执行一条 INSERT SQL 语句。 $table 参数指定要插入的表,而键值对数组 $columns 指定要插入的列的值。该方法将转义表名,并且将与绑定参数结合使用。

下面是一个例子:

// build and execute the following SQL:
// INSERT INTO `tbl_user` (`name`, `email`) VALUES (:name, :email)
$command->insert('tbl_user', array(
  'name'=>'Tester',
  'email'=>'tester@example.com',
));
登入後複製

update()

function update($table, $columns, $conditions='', $params=array())
登入後複製

update()方法的建立和执行一个SQL更新语句。 $table 参数指定要更新的表; $columns 是键值对的数组,用于指定要更新的列值的;$conditions 和 $params 像where()一样,指定 UPDATE 语句中的 WHERE 子句。该方法将转义表名,并且将与要更新的值的参数结合使用。

下面是一个例子:

// build and execute the following SQL:
// UPDATE `tbl_user` SET `name`=:name WHERE id=:id
$command->update('tbl_user', array(
  'name'=>'Tester',
), 'id=:id', array(':id'=>1));
登入後複製

delete()

function delete($table, $conditions='', $params=array())
登入後複製

delete()方法的建立和执行一个SQL删除语句。 $table 参数指定要删除数据的表;$conditions 和$params像where()一样,指定 DELETE 语句中的 WHERE 子句。该方法将正确转义表名。

下面是一个例子:

// build and execute the following SQL:
// DELETE FROM `tbl_user` WHERE id=:id
$command->delete('tbl_user', 'id=:id', array(':id'=>1));
登入後複製

4. 建立架构操作查询(Building Schema Manipulation Queries)

除了正常的数据检索和操作查询,查询生成器提供了一套用于可以操纵数据库的构建和执行SQL查询的方法。它支持以下操作:

createTable(): 创建一个表
renameTable(): 重命名表
dropTable(): 删除一个表
truncateTable(): 截断一个表,即删除表中的所有数据但不删除表本身
addColumn(): 给表添加列
renameColumn(): 重命名表中的列
alterColumn(): 改变一个表的列
addForeignKey(): 添加一个外键(自1.1.6可用)
dropForeignKey(): 删除一个外键(自1.1.6可用)
dropColumn(): 删除一个表的列
createIndex(): 创建一个索引
dropIndex(): 删除一个索引

Info: 虽然在不同的数据库管理系统中SQL语句操作数据库的模式有很大的不同,但查询生成器试图提供一个统一的接口,用于构建这些查询。这简化了数据库迁移从一个数据库管理系统到另一个任务。

抽象数据类型 Abstract Data Types

查询生成器中引入了一组可以在定义表的列中使用抽象数据类型。与物理数据类型不同,物理数据类型有具体独特的DBMS而且在不同的DBMS中有很大的不同,抽象数据类型都是独立的DBMS。当抽象数据类型在定义表的列中使用时,查询生成器将其转换成相应的物理数据类型。

下面的抽象数据类型由查询生成器的支持。

pk: 一个通用的主键类型,将被转换成 int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY for MySQL;
string: 字符串类型,将被转换成 varchar(255) for MySQL;
text: 文本型(长字符串),将被转换成 text for MySQL;
integer: 整数类型,将被转换成 int(11) for MySQL;
float: 浮点数类型,将被转换成 float for MySQL;
decimal: 十进制数类型,将被转换成 decimal for MySQL;
datetime: datetime类型,将被转换成 datetime for MySQL;
timestamp: 时间戳类型,将被转换成 timestamp for MySQL;
time: 时间类型,将被转换成 time for MySQL;
date: 日期类型,将被转换成 date for MySQL;
binary: 二进制数据类型,将被转换成 blob for MySQL;
boolean: 布尔类型,将被转换成 tinyint(1) for MySQL;
money: 金钱/货币型,将被转换成 decimal(19,4) for MySQL. 自1.1.8版本开始此类型可以使用。

createTable()

function createTable($table, $columns, $options=null)
登入後複製

createTable() 方法构建和执行一条创建表的SQL语句。$table 参数指定要创建的表的名称。 $columns 参数指定在新表中的列。他们必须被指定为名称类型的键值对(e.g. 'username'=>'string')。 $options 参数指定应附加到生成的SQL上的任何额外的SQL片段。查询生成器将正确的引用的表名以及列名。

当指定一个列的定义时,可以使用如上所述的抽象数据类型。查询生成器会根据当前使用的数据库管理系统的抽象数据类型转换成相应的物理数据类型。例如,string 类型将被转换为MySQL的 varchar(255)。

一个列定义还可以包含非抽象数据类型或规格。他们将没有任何改变的被放置在生成的SQL中。例如,point 不是一个抽象数据类型,如果用在列定义,它会出现在生成的SQL中,而且 string NOT NULL将被转换varchar(255) NOT NULL(即只有抽象类型的字符串转换)。

下面是一个例子,显示了如何创建一个表:

// CREATE TABLE `tbl_user` (
//   `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
//   `username` varchar(255) NOT NULL,
//   `location` point
// ) ENGINE=InnoDB
createTable('tbl_user', array(
  'id' => 'pk',
  'username' => 'string NOT NULL',
  'location' => 'point',
), 'ENGINE=InnoDB')
登入後複製

renameTable()

function renameTable($table, $newName)
登入後複製

renameTable() 方法创建和执行一条重命名表名的SQL语句。 $table 参数指定要重命名的表的名称。 $newName 参数指定表的新名称。查询生成器将正确引用的表名。

下面是一个示例,演示了如何重命名表:

// RENAME TABLE `tbl_users` TO `tbl_user`
renameTable('tbl_users', 'tbl_user')
登入後複製

dropTable()

function dropTable($table)
登入後複製

dropTable() 方法创建和执行一条删除表的SQL语句。在$table 参数指定要删除的表的名称。查询生成器会正确地引用的表名。

下面是一个示例展示如何删除一个表:

// DROP TABLE `tbl_user`
dropTable('tbl_user')
登入後複製

truncateTable()

function truncateTable($table)
登入後複製

truncateTable() 方法建立和执行一条清空表数据的SQL语句。 $table 参数指定清空的表名。查询生成器会正确地引用的表名。

下面是一个示例显示如何清空表:

// TRUNCATE TABLE `tbl_user`
truncateTable('tbl_user')
登入後複製

addColumn()

function addColumn($table, $column, $type)
登入後複製

addColumn() 方法创建并执行一条添加一个表的新列的SQL语句。 $table 参数指定新列将被添加到的表的名称。 $column 参数指定新列的名称。 $type 指定新列的定义。列定义中可以包含抽象数据类型,如 "createTable"小节中的描述。查询生成器将正确的引用的表名以及列名。

下面是一个示例,演示如何添加一个表的列:

// ALTER TABLE `tbl_user` ADD `email` varchar(255) NOT NULL
addColumn('tbl_user', 'email', 'string NOT NULL')
登入後複製

dropColumn()

function dropColumn($table, $column)
登入後複製

dropColumn() 方法创建和执行一条删除表列的SQL语句。 $table 参数指定要被删除的列所属的表名。 $column 参数指定要被删除的列名。查询生成器将正确地引用的表名以及列名。

下面是一个示例展示如何删除一个表列:

// ALTER TABLE `tbl_user` DROP COLUMN `location`
dropColumn('tbl_user', 'location')
登入後複製

renameColumn()

function renameColumn($table, $name, $newName)
登入後複製

renameColumn() 方法创建和执行一条重命名列的SQL语句。 $table 参数指定要重命名的列所属的表的名称。 $name 参数指定的旧列名。 $newName 指定新的列名。查询生成器将正确地引用的表名以及列名。

下面是一个示例,展示了如何重命名表列:

// ALTER TABLE `tbl_users` CHANGE `name` `username` varchar(255) NOT NULL
renameColumn('tbl_user', 'name', 'username')
登入後複製

alterColumn()

function alterColumn($table, $column, $type)
登入後複製

alterColumn() 方法创建和执行一条修改表列的SQL语句。 $table 参数指定要被改变的列所属的表的名称。 $column 参数指定被改变的列的名称。$type 指定列的新定义。列定义中可以包含抽象数据类型,如 "createTable"小节中的描述。查询生成器将正确的引用的表名以及列名。

下面是一个示例,展示了如何更改一个表列:

// ALTER TABLE `tbl_user` CHANGE `username` `username` varchar(255) NOT NULL
alterColumn('tbl_user', 'username', 'string NOT NULL')
登入後複製

addForeignKey()

function addForeignKey($name, $table, $columns,$refTable, $refColumns, $delete=null, $update=null)
登入後複製

addForeignKey() 方法创建和执行一条添加一个外键约束SQL语句。 $name 参数指定外键的名称。 $table 和 $columns 参数指定外键的表名和列名。如果有多个列,他们应该用逗号字符分隔。 $refTable 和 $refColumns 参数指定表名和列名的外键引用。 $delete 和 $update 参数指定 SQL语句中的 ON DELETE 和ON UPDATE选项。大多数的DBMS都支持这些选项:RESTRICT, CASCADE, NO ACTION, SET DEFAULT, SET NULL. 。查询生成器会正确地引用表名,索引名和列名。

下面是一个示例,演示如何添加一个外键约束:

// ALTER TABLE `tbl_profile` ADD CONSTRAINT `fk_profile_user_id`
// FOREIGN KEY (`user_id`) REFERENCES `tbl_user` (`id`)
// ON DELETE CASCADE ON UPDATE CASCADE
addForeignKey('fk_profile_user_id', 'tbl_profile', 'user_id', 'tbl_user', 'id', 'CASCADE', 'CASCADE')
登入後複製

dropForeignKey()

function dropForeignKey($name, $table)
登入後複製

dropForeignKey() 方法创建和执行一条删除一个外键约束的SQL语句。 $name 参数指定的要删除的外键约束的名称。 $table 参数指定外键所属的表的名称。查询生成器将正确地引用的表名以及约束名称。

下面是一个示例,显示了如何删除外键约束:

// ALTER TABLE `tbl_profile` DROP FOREIGN KEY `fk_profile_user_id`
dropForeignKey('fk_profile_user_id', 'tbl_profile')
登入後複製

createIndex()

function createIndex($name, $table, $column, $unique=false)
登入後複製

createIndex() 方法构建和执行一条创建索引的SQL语句。 $name 参数指定要创建的索引的名称。$table 参数指定索引所属的表的名称。$column 参数指定要索引的列的名称。 $unique 参数指定是否创建一个唯一索引。如果索引由多个列,则必须用逗号将它们隔开。查询生成器会正确地引用表名,索引名和列名。

下面是一个示例,显示了如何创建索引:

// CREATE INDEX `idx_username` ON `tbl_user` (`username`)
createIndex('idx_username', 'tbl_user', 'username')
登入後複製

dropIndex()

function dropIndex($name, $table)
登入後複製

dropIndex() 方法创建和执行一条删除索引的SQL语句。 $name 参数指定要删除的索引的名称。$table 参数指定索引所属的表的名称。查询生成器将正确地引用的表名以及索引名称。

下面是一个示例,显示了如何删除索引:

// DROP INDEX `idx_username` ON `tbl_user`
dropIndex('idx_username', 'tbl_user')
登入後複製

希望本文所述对大家yii学习有所帮助。

更多Yii查询生成器(Query Builder)用法实例教程相关文章请关注PHP中文网!

相關標籤:
yii
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板