目录
Yii查询生成器(Query Builder)用法实例教程,yiibuilder
Selectquerybuilder类c# 类的用法 在哪个命名空间下?
yii中使用gii生成model时报错,表都建好了,解答
首页 php教程 php手册 Yii查询生成器(Query Builder)用法实例教程,yiibuilder

Yii查询生成器(Query Builder)用法实例教程,yiibuilder

Jun 13, 2016 am 09:25 AM
yii

Yii查询生成器(Query Builder)用法实例教程,yiibuilder

本文为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学习有所帮助。

Selectquerybuilder类c# 类的用法 在哪个命名空间下?

tieba.baidu.com/f?kz=192195630
 

yii中使用gii生成model时报错,表都建好了,解答

apache 服务器问题,与Yii无关,建议重新安装或升级新版本apache
参考资料:apache.org/
 

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

php如何使用Yii3框架? php如何使用Yii3框架? May 31, 2023 pm 10:42 PM

随着互联网的不断发展,Web应用程序开发的需求也越来越高。对于开发人员而言,开发应用程序需要一个稳定、高效、强大的框架,这样可以提高开发效率。Yii是一款领先的高性能PHP框架,它提供了丰富的特性和良好的性能。Yii3是Yii框架的下一代版本,它在Yii2的基础上进一步优化了性能和代码质量。在这篇文章中,我们将介绍如何使用Yii3框架来开发PHP应用程序。

如何使用PHP框架Yii开发一个高可用的云备份系统 如何使用PHP框架Yii开发一个高可用的云备份系统 Jun 27, 2023 am 09:04 AM

随着云计算技术的不断发展,数据的备份已经成为了每个企业必须要做的事情。在这样的背景下,开发一款高可用的云备份系统尤为重要。而PHP框架Yii是一款功能强大的框架,可以帮助开发者快速构建高性能的Web应用程序。下面将介绍如何使用Yii框架开发一款高可用的云备份系统。设计数据库模型在Yii框架中,数据库模型是非常重要的一部分。因为数据备份系统需要用到很多的表和关

Yii2 vs Phalcon:哪个框架更适合开发显卡渲染应用? Yii2 vs Phalcon:哪个框架更适合开发显卡渲染应用? Jun 19, 2023 am 08:09 AM

在当前信息时代,大数据、人工智能、云计算等技术已经成为了各大企业关注的热点。在这些技术中,显卡渲染技术作为一种高性能图形处理技术,受到了越来越多的关注。显卡渲染技术被广泛应用于游戏开发、影视特效、工程建模等领域。而对于开发者来说,选择一个适合自己项目的框架,是一个非常重要的决策。在当前的语言中,PHP是一种颇具活力的语言,一些优秀的PHP框架如Yii2、Ph

Symfony vs Yii2:哪个框架更适合开发大型Web应用? Symfony vs Yii2:哪个框架更适合开发大型Web应用? Jun 19, 2023 am 10:57 AM

随着Web应用需求的不断增长,开发者们在选择开发框架方面也越来越有选择的余地。Symfony和Yii2是两个备受欢迎的PHP框架,它们都具有强大的功能和性能,但在面对需要开发大型Web应用时,哪个框架更适合呢?接下来我们将对Symphony和Yii2进行比较分析,以帮助你更好地进行选择。基本概述Symphony是一个由PHP编写的开源Web应用框架,它是建立

Yii框架中的数据查询:高效地访问数据 Yii框架中的数据查询:高效地访问数据 Jun 21, 2023 am 11:22 AM

Yii框架是一个开源的PHPWeb应用程序框架,提供了众多的工具和组件,简化了Web应用程序开发的流程,其中数据查询是其中一个重要的组件之一。在Yii框架中,我们可以使用类似SQL的语法来访问数据库,从而高效地查询和操作数据。Yii框架的查询构建器主要包括以下几种类型:ActiveRecord查询、QueryBuilder查询、命令查询和原始SQL查询

yii如何将对象转化为数组或直接输出为json格式 yii如何将对象转化为数组或直接输出为json格式 Jan 08, 2021 am 10:13 AM

yii框架:本文为大家介绍了yii将对象转化为数组或直接输出为json格式的方法,具有一定的参考价值,希望能够帮助到大家。

Yii2编程指南:运行Cron服务的方法 Yii2编程指南:运行Cron服务的方法 Sep 01, 2023 pm 11:21 PM

如果您问“Yii是什么?”查看我之前的教程:Yii框架简介,其中回顾了Yii的优点,并概述了2014年10月发布的Yii2.0的新增功能。嗯>在这个使用Yii2编程系列中,我将指导读者使用Yii2PHP框架。在今天的教程中,我将与您分享如何利用Yii的控制台功能来运行cron作业。过去,我在cron作业中使用了wget—可通过Web访问的URL来运行我的后台任务。这引发了安全问题并存在一些性能问题。虽然我在我们的启动系列安全性专题中讨论了一些减轻风险的方法,但我曾希望过渡到控制台驱动的命令

Yii框架中的表单构建器:构建复杂表单 Yii框架中的表单构建器:构建复杂表单 Jun 21, 2023 am 10:09 AM

随着互联网的快速发展,Web应用越来越成为人们生活中不可或缺的一部分。而表单是Web应用中不可或缺的元素之一,其用于收集用户数据,让Web应用能够更好地为用户服务。Yii框架是一个快速、高效、灵活的PHP框架,可以帮助开发人员更加快速地开发Web应用。Yii框架中的表单构建器(FormBuilder)可以让开发人员轻松地构建复杂的表单,让Web应用具有更好

See all articles