当前位置:必发365电子游戏 > 编程 > Yii的询问生成器提供了用面向对象的格局写SQL语句,在CODE上查看代码片派生到自家的代码片
Yii的询问生成器提供了用面向对象的格局写SQL语句,在CODE上查看代码片派生到自家的代码片
2019-12-19

原稿地址:

Query Builder

然则原来的书文是芬兰语的,Yii的官方网址未有翻译那生龙活虎章,本人就尝试着翻译了眨眼间间,有那叁个地方时会按自个儿的知晓写,不分明完全按原来的文章翻译。。。

$rows = (new yiidbQuery())

Yii的查询生成器提供了用面向对象的措施写SQL语句。它同意开垦人士使用类的艺术和质量来钦点二个SQL语句的风流倜傥生龙活虎部分。然后,组装成一个卓有效能的SQL语句,能够透过调用DAO数据访谈对象的描述方法为更为实践。以下展现了四个卓绝的使用查询生成器创建四个select语句:

->select(['dyn_id', 'dyn_name'])

$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();

->from('zs_dynasty')

当您在应用程序中要求创立SQL语句的程序,或根据一些条件逻辑时,最好使用查询生成器。使用查询生成器的功利首要总结:

->where(['between','dyn_id', 1,30])

->limit(10)

它不强制行使查询生成器。事实上,即使你的查询是粗略的,它是更便于和越来越快的一向写SQL语句。

->all();

注:查询生成器不可能用来校订现存的查询钦赐为SQL语句。比方,下边包车型大巴代码将不能够干活:

print_r($rows);

$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));

在CODE上查看代码片派生到自身的代码片

换句话说,不要混合使用普通的SQL和查询生成器。

use yiidbQuery;

1. 筹备查询生成器(Preparing Query Builder)

Yii的查询生成器是从 CDbCommand 提供至关心重视要数据库查询类,描述数据访谈对象。

始发利用查询生成器,大家成立了 CDbCommand 的三个新实例,

$command = Yii::app()->db->createCommand();

大家使用 Yii::app()->db 来得到数据库连接,然后调用 CDbConnection::createCommand() 创立所需的一声令下实例。

请在意,将整个SQL语句放入 createcommand(卡塔尔(英语:State of Qatar),叫做数据访谈对象,大家需呀把设置它为空。那是因为大家就要上边的诠释中应用查询生成器增加SQL语句的次第部分的不二秘籍。

$query = (new Query())

2. 独当一面数据检索查询(Building Data Retrieval Queries)

数据检索查询是指选用SQL语句。查询生成器提供了后生可畏套方法来确立二个SELECT语句的相继部分。因为具有这一个措施重临 CDbCommand 的实例,大家可以使用办法链调用他们,如图所示,在本节最初的例证。

在上面,大家将表达怎么着接受那几个查询生成器方法。为简易起见,大家只要底层数据库是MySQL。注意:要是你利用的是其余数据库,表/列/值援引的例证可能是差异的。

->from('user')

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'))

->orderBy('id');

selectDistinct()

function selectDistinct($columns)

selectdistinct(卡塔尔国方法肖似于select(卡塔尔国,除了它开垦了 DISTINCT 的评释。比方,selectdistinct('id,顾客名”)会发出以下SQL:

SELECT DISTINCT `id`, `username`

SELECT

from()

function from($tables)

from(卡塔尔(英语:State of Qatar)方法钦定来了七个询问的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'))

在CODE上查看代码片派生到自家的代码片

where()

function where($conditions, $params=array())

where(卡塔尔(英语:State of Qatar)方法钦点询问的WHERE。$conditions 参数内定询问条件的同不经常间,$params 钦赐参数绑定到一切查询。$conditions参数能够是三个字符串(比方id = 1)或三个数组中的格式:

array(operator, operand1, operand2, ...)

operator 能够是以下的别的叁个:

上面是一些例证,使用的地点:

// 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.'%'));

$query->select('*')->

andWhere()

function andWhere($conditions, $params=array())

用 and 的艺术丰裕到WHERE的规范中。此格局的行为大概是 where(卡塔尔相同,除了它只是丰硕条件不可能替代它。在 where(卡塔尔(英语:State of Qatar) 文档中有该情势参数的详细音讯。

select('dyn_id as id, dynasty.dyn_name')->

orWhere()

function orWhere($conditions, $params=array())

用 or 的形式丰裕到WHERE的标准中。此方法的作为大约是 where(卡塔尔(قطر‎雷同,除了它只是加上条件不能够替代它。在 where(卡塔尔国 文书档案中有该方法参数的详细音讯。

$query->select(['dyn_id as id', "CONCAT(dyn_name,'a')"])->

order()

function order($columns)

order(卡塔尔(英语:State of Qatar) 方法钦命询问的O安德拉DER 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'))

$query->select('user_id')->distinct()->

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)

FORM

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(卡塔尔(英语:State of Qatar)方法及其变种钦点如何与此外表连接,使用个中联接,左外连接,右外界联接,交叉连接,或自然连接。 $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))

在CODE上查看代码片派生到自己的代码片

group()

function group($columns)

group(卡塔尔(英语:State of Qatar) 方法钦定询问的GROUP BY。 $columns 参数钦命列进行分组,它能够是一个用逗号分隔的列的字符串,恐怕一个列的数组。列名称能够蕴含表前缀。该方式将电动引用列名,除非一列满含部分括号(便是三个DB 表明式)。

上边是局地事例:

// GROUP BY `name`, `id`
group('name, id')
// GROUP BY `tbl_profile`.`name`, `id`
group(array('tbl_profile.name', 'id'))

$query->from('user');

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'))

$query->from(['public.user u', 'public.post p']);

union()

function union($sql)

union(卡塔尔 方法钦点询问 UNION。它应用UNION操作附加到存活的SQL上。调用union(卡塔尔(英语:State of Qatar)数十次将长存的SQL附加多少个表。

上面是局地事例:

// UNION (select * from tbl_profile)
union('select * from tbl_profile')

$query->from('public.user u, public.post p');

实行查询(Executing Queries)

调用下面查询生成器的办法来创立多少个询问后,大家得以调用DAO方法数据访谈对象进行查询。比方,大家得以调用 CDbCommand::queryRow() 得到一而再三回九转的结果,可能应用 CDbCommand::queryAll() 马上获得全体行。

例子:

$users = Yii::app()->db->createCommand()
    ->select('*')
    ->from('tbl_user')
    ->queryAll();

$query->from(['u' => 'public.user', 'p' => 'public.post']);

检索表(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();

$subQuery = (new Query())->select('id')->from('user')->where('status=1');

确立八个查询(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();

// SELECT * FROM (SELECT `id` FROM `user` WHERE status=1) u

3. 起家数量操作查询(Building Data Manipulation Queries卡塔尔

数量操作查询是指SQL语句插入,更新和删除数据库表中的数码。对应于那么些查询,查询生成器分别提供了插入,更新和删除的措施。不相同于下面介绍 SELECT 的询问办法,那些多少操作查询艺术将确立八个后生可畏体化的SQL语句,并立即试行。

上面描述了那个数据操作查询办法。

$query->from(['u' => $subQuery]);

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',
));

WHERE

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));

在CODE上查看代码片派生到本身的代码片

delete()

function delete($table, $conditions='', $params=array())

delete(卡塔尔(英语:State of Qatar)方法的制造和实践一个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));

where('status=1')->

4. 自力谋生布局操作查询(Building Schema Manipulation Queries)

除却健康的数据检索和操作查询,查询生成器提供了后生可畏套用于能够调整数据库的营造和实行SQL查询的诀要。它协理以下操作:

Info: 即使在不一致的数据库管理类别中SQL语句操作数据库的格局有不小的例外,但询问生成器试图提供多个归总的接口,用于营造这么些查询。那简化了数据库迁移从二个数据库管理种类到另一个职务。

where('status=:status', [':status' => $status])->

抽象数据类型 Abstract Data Types

查询生成器中引进了风华正茂组能够在定义表的列中使用抽象数据类型。与物理数据类型不一样,物理数据类型有切实可行独特的DBMS何况在不相同的DBMS中有超级大的两样,抽象数据类型都以独立的DBMS。当抽象数据类型在定义表的列中使用时,查询生成器将其调换来相应的物理数据类型。 

上面包车型大巴抽象数据类型由询问生成器的支撑。 

where([

createTable()

function createTable($table, $columns, $options=null)

 createTable() 方法创设和实行一条创制表的SQL语句。$table 参数内定要开创的表的称号。 $columns 参数钦赐在新表中的列。他们不得不被钦命为名称类型的键值对(e.g. 'username'=>'string')。 $options 参数内定应附加到变化的SQL上的任何附加的SQL片段。查询生成器将准确的引用的表名以至列名。

当钦定二个列的概念时,可以行使如上所述的抽象数据类型。查询生成器会基于当下利用的数据库管理种类的抽象数据类型转变来相应的情理数据类型。比如,string 类型将被转变为MySQL的 varchar(255卡塔尔(英语:State of Qatar)。

八个列定义还足以包括非抽象数据类型或标准。他们将还没任何改换的被放置在变化的SQL中。比方,point不是八个抽象数据类型,假若用在列定义,它会出以后转换的SQL中,并且 string NOT NULL将被转变varchar(255卡塔尔(英语:State of Qatar)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')

'status' => 10,

renameTable()

function renameTable($table, $newName)

renameTable() 方法创造和履行一条重命名表名的SQL语句。 $table 参数钦命要重命名的表的名目。 $newName 参数内定表的新名称。查询生成器将科学引用的表名。

上边是二个演示,演示了怎么着重命名表:

// RENAME TABLE `tbl_users` TO `tbl_user`
renameTable('tbl_users', 'tbl_user')

'type' => null,

dropTable()

function dropTable($table)

dropTable() 方法创造和施行一条删除表的SQL语句。在$table 参数钦定要刨除的表的称谓。查询生成器会正确地援引的表名。

下边是八个示范展现如何删除七个表:

// DROP TABLE `tbl_user`
dropTable('tbl_user')

'id' => [4, 8, 15],

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')

$userQuery = (new Query())->select('id')->from('user');

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')

// ...WHERE `id` IN (SELECT `id` FROM `user`)

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')

$query->...->where(['id' => $userQuery])->...

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都帮衬这么些选用:RESTRICTCASCADENO ACTIONSET DEFAULTSET 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')

['and', 'id=1', 'id=2'] //id=1 AND id=2

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')

['and', 'type=1', ['or', 'id=1', 'id=2']] //type=1 AND (id=1 OR id=2)

dropIndex()

function dropIndex($name, $table)

dropIndex() 方法制造和奉行一条删除索引的SQL语句。 $name 参数钦赐要刨除的目录的称谓。$table 参数内定索引所属的表的称呼。查询生成器将科学地引用的表名以致索引名称。

上面是三个演示,展现了怎么着删除索引:

// DROP INDEX `idx_username` ON `tbl_user`
dropIndex('idx_username', 'tbl_user')

 

终于翻译完了~
如有错误或看不懂的地点,应接留言

 

 

['between', 'id', 1, 10] //id BETWEEN 1 AND 10

['not between', 'id', 1, 10] //not id BETWEEN 1 AND 10

['in', 'id', [1, 2, 3]] //id IN (1, 2, 3)

['not in', 'id', [1, 2, 3]] //not id IN (1, 2, 3)

['like', 'name', 'tester'] //name LIKE '%tester%'

['like', 'name', ['test', 'sample']] //name LIKE '%test%' AND name LIKE '%sample%'

['not like', 'name', ['or', 'test', 'sample']] //not name LIKE '%test%' OR not name LIKE '%sample%'

['exists','id', $userQuery] //EXISTS (sub-query) | not exists

['>', 'age', 10] //age>10

ADD WHERE

在CODE上查看代码片派生到自个儿的代码片

$status = 10;

$search = 'yii';

$query->where(['status' => $status]);

if (!empty($search)) {

$query->andWhere(['like', 'title', $search]);

}

//WHERE (`status` = 10) AND (`title` LIKE '%yii%')

//andWhere() or orWhere()

FILTER WHERE

在CODE上查看代码片派生到小编的代码片

$query->filterWhere([

'username' => $username,

'email' => $email,

]);

//如果email为空,则 WHERE username=:username

ORDER BY

在CODE上查看代码片派生到本身的代码片

$query->orderBy([

'id' => SORT_ASC,

'name' => SORT_DESC,

]);

//orderBy , addOrderBy

GROUP BY

在CODE上查看代码片派生到自个儿的代码片

$query->groupBy('id, status');

$query->addGroupBy(['created_at', 'updated_at']);

HAVING

在CODE上查看代码片派生到自家的代码片

$query->having(['status' => $status]);

//having,andHaving,orHaving

LIMIT OR OFFSET

在CODE上查看代码片派生到笔者的代码片

$query->limit(10);

$query->offset(10);

JOIN

innerJoin()

leftJoin()

rightJoin()

在CODE上查看代码片派生到本身的代码片

$query->select(['user.name AS author', 'post.title as title'])

->from('user')

->leftJoin('post', 'post.user_id = user.id');

$query->join('FULL OUTER JOIN', 'post', 'post.user_id = user.id');

$query->leftJoin(['u' => $subQuery], 'u.id=author_id');

UNION

在CODE上查看代码片派生到本身的代码片

$query = new Query();

$query->select("id, category_id as type, name")->from('post')->limit(10);

$anotherQuery = new Query();

$anotherQuery->select('id, type, name')->from('user')->limit(10);

$query->union($anotherQuery);

QUERY METHODS

all(卡塔尔(قطر‎ //全体行列

one() //第一行

column() //第一列

scalar(卡塔尔(英语:State of Qatar) //第蓬蓬勃勃行第一列

exists(卡塔尔 //是不是有结果存在

count(卡塔尔 //记录数量

sum($q卡塔尔国, average($q卡塔尔, max($q卡塔尔(英语:State of Qatar), min($q卡塔尔 //$q 为字段或表明式

在CODE上查看代码片派生到本人的代码片

$count = (new yiidbQuery())

->from('user')

->where(['last_name' => 'Smith'])

->count();

//SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name

$command = (new yiidbQuery())

->select(['id', 'email'])

->from('user')

->where(['last_name' => 'Smith'])

->limit(10)

->createCommand();

// show the SQL statement

echo $command->sql;

// show the parameters to be bound

print_r($command->params);

// returns all rows of the query result

$rows = $command->queryAll();

QUERY RESULTS

在CODE上查看代码片派生到自己的代码片

use yiidbQuery;

$query = (new Query())

->from('user')

->indexBy('username');

foreach ($query->batch() as $users) {

// $users is indexed by the "username" column

}

foreach ($query->each() as $username => $user) {

}

INDEXING

在CODE上查看代码片派生到自家的代码片

use yiidbQuery;

$query = (new Query())

Yii的询问生成器提供了用面向对象的格局写SQL语句,在CODE上查看代码片派生到自家的代码片。->from('user')

->orderBy('id');

foreach ($query->batch() as $users) {

// batch( $batchSize = 100, $db = null )

// 叁个批次取100行

}

foreach ($query->each() as $user) {

// 后生可畏行意气风发行取

}

上一篇:没有了