当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

查询生成器(Query Builder): 使用简单抽象层查询数据库

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:28:58

包含一些 DB 表达式的时候,你应该使用数组的格式。你可以调用 [yii\db\Query::addOrderBy()|addOrderBy()]] 来为?GROUP BY?子句添加额外的字段。例如,$query->groupBy(['id', 'status']) ->addGroupBy('age');yii\db\Query::having()yii\db\Query::having() 方法是用来指定 SQL 语句当中的?HAVING?子句。它带有一个条件, 和?where()?中指定条件的方法一样。例如,// ... HAVING `status` = 1$query->having(['status' => 1]);请查阅?where()?的文档来获取更多有关于如何指定一个条件的细节。你可以调用 yii\db\Query::andHaving() 或者 yii\db\Query::orHaving() 方法来为?HAVING?子句追加额外的条件,例如,// ... HAVING (`status` = 1) AND (`age` > 30)$query->having(['status' => 1]) ->andHaving(['>', 'age', 30]);yii\db\Query::limit() 和 yii\db\Query::offset()`yii\db\Query::limit() 和 yii\db\Query::offset() 是用来指定 SQL 语句当中 的?LIMIT?和?OFFSET?子句的。例如,// ... LIMIT 10 OFFSET 20$query->limit(10)->offset(20);如果你指定了一个无效的 limit 或者 offset(例如,一个负数),那么它将会被忽略掉。提示:在不支持?LIMIT?和?OFFSET?的 DBMS 中(例如,MSSQL), 查询构建器将生成一条模拟?LIMIT/OFFSET?行为的 SQL 语句。yii\db\Query::join()[yii\db\Query::join()|join()]] 是用来指定 SQL 语句当中的?JOIN?子句的。例如,php// LEFT JOIN?post?ON?post.user_id?=?user.id$query->join('LEFT JOIN', 'post', 'post.user_id = user.id'); yii\db\Query::join() 带有四个参数:* `$type`: 连接类型,例如:`'INNER JOIN'`,?`'LEFT JOIN'`。* `$table`: 将要连接的表名称。* `$on`: 可选参数,连接条件,即?`ON`?子句。请查阅?[where()](http://www.yiichina.com/doc/guide/2.0/db-query-builder#where)?获取更多有关于条件定义的细节。* `$params`: 可选参数,与连接条件绑定的参数。你可以分别调用如下的快捷方法来指定?`INNER JOIN`,?`LEFT JOIN`?和?`RIGHT JOIN`。* yii\db\Query::innerJoin()* yii\db\Query::leftJoin()* yii\db\Query::rightJoin()例如,$query->leftJoin('post', 'post.user_id = user.id');可以通过多次调用如上所述的连接方法来连接多张表,每连接一张表调用一次。除了连接表以外,你还可以连接子查询。方法如下,将需要被连接的子查询指定 为一个 yii\db\Query 对象,例如,$subQuery = (new \yii\db\Query())->from('post');$query->leftJoin(['u' => $subQuery], 'u.id = author_id');在这个例子当中,你应该将子查询放到一个数组当中,而数组当中的键,则为这个子查询的别名。 yii\db\Query::union()yii\db\Query::union() 方法是用来指定 SQL 语句当中的?`UNION`?子句的。例如,$query1 = (new \yii\db\Query()) ->select("id, category_id AS type, name") ->from('post') ->limit(10);$query2 = (new \yii\db\Query()) ->select('id, type, name') ->from('user') ->limit(10);$query1->union($query2~~~);你可以通过多次调用 yii\db\Query::union() 方法来追加更多的?UNION?子句。查询方法yii\db\Query 提供了一整套的用于不同查询目的的方法。yii\db\Query::all(): 将返回一个由行组成的数组,每一行是一个由名称和值构成的关联数组(译者注:省略键的数组称为索引数组)。yii\db\Query::one(): 返回结果集的第一行。yii\db\Query::column(): 返回结果集的第一列。yii\db\Query::scalar(): 返回结果集的第一行第一列的标量值。yii\db\Query::exists(): 返回一个表示该查询是否包结果集的值。yii\db\Query::count(): 返回?COUNT?查询的结果。其它集合查询方法: 包括 yii\db\Query::sum(), yii\db\Query::average(), yii\db\Query::max(), yii\db\Query::min() 等.?$q?是一个必选参数, 既可以是一个字段名称,又可以是一个 DB 表达式。例如,// SELECT `id`, `email` FROM `user`$rows = (new \yii\db\Query()) ->select(['id', 'email']) ->from('user') ->all();// SELECT * FROM `user` WHERE `username` LIKE `%test%`$row = (new \yii\db\Query()) ->from('user') ->where(['like', 'username', 'test']) ->one();注意:yii\db\Query::one() 方法只返回查询结果当中的第一条数据, 条件语句中不会加上?LIMIT 1?条件。如果你清楚的知道查询将会只返回一行或几行数据 (例如, 如果你是通过某些主键来查询的),这很好也提倡这样做。但是,如果查询结果 有机会返回大量的数据时,那么你应该显示调用?limit(1)?方法,以改善性能。 例如,?(new \yii\db\Query())->from('user')->limit(1)->one()。所有的这些查询方法都有一个可选的参数?$db, 该参数指代的是 yii\db\Connection, 执行一个 DB 查询时会用到。如果你省略了这个参数,那么?db?application component?将会被用作 默认的 DB 连接。 如下是另外一个使用?count()?查询的例子:// 执行 SQL: SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name$count = (new \yii\db\Query()) ->from('user') ->where(['last_name' => 'Smith']) ->count();当你调用 yii\db\Query 当中的一个查询方法的时候,实际上内在的运作机制如下:在当前 yii\db\Query 的构造基础之上,调用 yii\db\QueryBuilder 来生成一条 SQL 语句;利用生成的 SQL 语句创建一个 yii\db\Command 对象;调用 yii\db\Command 的查询方法(例如,queryAll())来执行这条 SQL 语句,并检索数据。有时候,你也许想要测试或者使用一个由 yii\db\Query 对象创建的 SQL 语句。 你可以使用以下的代码来达到目的:$command = (new \yii\db\Query()) ->select(['id', 'email']) ->from('user') ->where(['last_name' => 'Smith']) ->limit(10) ->createCommand();// 打印 SQL 语句echo $command->sql;// 打印被绑定的参数print_r($command->params);// 返回查询结果的所有行$rows = $command->queryAll();索引查询结果当你在调用 yii\db\Query::all() 方法时,它将返回一个以连续的整型数值为索引的数组。 而有时候你可能希望使用一个特定的字段或者表

上一页  [1] [2] [3] [4]  下一页


查询生成器(Query Builder): 使用简单抽象层查询数据库