Yii2 数据查询
转载来自: http://www.yiichina.com/tutorial/95
数据查询
- User::find()->all(); 此方法返回所有数据;
- User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子);
- User::find()->where(['name' => '小伙儿'])->one(); 此方法返回 ['name' => '小伙儿'] 的一条数据;
- User::find()->where(['name' => '小伙儿'])->all(); 此方法返回 ['name' => '小伙儿'] 的所有数据;
- User::find()->orderBy('id DESC')->all(); 此方法是排序查询;
- User::findBySql('SELECT * FROM user')->all(); 此方法是用 sql 语句查询 user 表里面的所有数据;
- User::findBySql('SELECT * FROM user')->one(); 此方法是用 sql 语句查询 user 表里面的一条数据;
- User::find()->andWhere(['sex' => '男', 'age' => '24'])->count('id'); 统计符合条件的总条数;
- User::find()->one(); 此方法返回一条数据;
- User::find()->all(); 此方法返回所有数据;
- User::find()->count(); 此方法返回记录的数量;
- User::find()->average(); 此方法返回指定列的平均值;
- User::find()->min(); 此方法返回指定列的最小值 ;
- User::find()->max(); 此方法返回指定列的最大值 ;
- User::find()->scalar(); 此方法返回值的第一行第一列的查询结果;
- User::find()->column(); 此方法返回查询结果中的第一列的值;
- User::find()->exists(); 此方法返回一个值指示是否包含查询结果的数据行;
- User::find()->batch(10); 每次取 10 条数据
- User::find()->each(10); 每次取 10 条数据, 迭代查询
多表查询:
- /* 多表联查 */
- $model=new Customer();
- $model->fiind()->join(‘LEFT JOIN‘,‘student‘,‘student.cid=customer.id‘)
- ->where(‘student.id‘=>\Yii::$app->user->id)
- ->andwhere(‘is_ok=1‘)
- ->one()
转载来自: http://www.yiifans.com/yii2/guide/db-active-record.html
关联查询
使用 AR 方法也可以查询数据表的关联数据(如,选出表A的数据可以拉出表B的关联数据)。 有了 AR, 返回的关联数据连接就像连接关联主表的 AR 对象的属性一样。
建立关联关系后,通过 $customer->orders
可以获取 一个 Order
对象的数组,该数组代表当前客户对象的订单集。
定义关联关系使用一个可以返回 [[yii\db\ActiveQuery]] 对象的 getter 方法, [[yii\db\ActiveQuery]]对象有关联上下文的相关信息,因此可以只查询关联数据。
- class Customer extends \yii\db\ActiveRecord
- {
- public function getOrders()
- {
- // 客户和订单通过 Order.customer_id -> id 关联建立一对多关系
- return $this->hasMany(Order::className(), ['customer_id' => 'id']);
- }
- }
- class Order extends \yii\db\ActiveRecord
- {
- // 订单和客户通过 Customer.id -> customer_id 关联建立一对一关系
- public function getCustomer()
- {
- return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
- }
- }
以上使用了 [[yii\db\ActiveRecord::hasMany()]] 和 [[yii\db\ActiveRecord::hasOne()]] 方法。 以上两例分别是关联数据多对一关系和一对一关系的建模范例。 如,一个客户有很多订单,一个订单只归属一个客户。 两个方法都有两个参数并返回 [[yii\db\ActiveQuery]] 对象。
建立关联关系后,获取关联数据和获取组件属性一样简单, 执行以下相应getter方法即可:
- // 取得客户的订单
- $customer = Customer::findOne(1);
- $orders = $customer->orders; // $orders 是 Order 对象数组
以上代码实际执行了以下两条 SQL 语句:
- SELECT * FROM customer WHERE id=1;
- SELECT * FROM order WHERE customer_id=1;
有时候需要在关联查询中传递参数,如不需要返回客户全部订单, 只需要返回购买金额超过设定值的大订单, 通过以下getter方法声明一个关联数据 bigOrders
:
- class Customer extends \yii\db\ActiveRecord
- {
- public function getBigOrders($threshold = 100)
- {
- return $this->hasMany(Order::className(), ['customer_id' => 'id'])
- ->where('subtotal > :threshold', [':threshold' => $threshold])
- ->orderBy('id');
- }
- }
联合查询
使用关系数据库时,普遍要做的是连接多个表并明确地运用各种 JOIN 查询。 JOIN SQL语句的查询条件和参数,使用 [[yii\db\ActiveQuery::joinWith()]] 可以重用已定义关系并调用 而不是使用 [[yii\db\ActiveQuery::join()]] 来实现目标。
- // 查找所有订单并以客户 ID 和订单 ID 排序,并贪婪加载 "customer" 表
- $orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all();
- // 查找包括书籍的所有订单,并以 `INNER JOIN` 的连接方式即时加载 "books" 表
- $orders = Order::find()->innerJoinWith('books')->all();
以上,方法 [[yii\db\ActiveQuery::innerJoinWith()|innerJoinWith()]] 是访问 INNER JOIN
类型的 [[yii\db\ActiveQuery::joinWith()|joinWith()]] 的快捷方式。
可以连接一个或多个关联关系,可以自由使用查询条件到关联查询, 也可以嵌套连接关联查询。如:
- // 连接多重关系
- // 找出24小时内注册客户包含书籍的订单
- $orders = Order::find()->innerJoinWith([
- 'books',
- 'customer' => function ($query) {
- $query->where('customer.created_at > ' . (time() - 24 * 3600));
- }
- ])->all();
- // 连接嵌套关系:连接 books 表及其 author 列
- $orders = Order::find()->joinWith('books.author')->all();
代码背后, Yii 先执行一条 JOIN SQL 语句把满足 JOIN SQL 语句查询条件的主要模型查出, 然后为每个关系执行一条查询语句, bing填充相应的关联记录。
[[yii\db\ActiveQuery::joinWith()|joinWith()]] 和 [[yii\db\ActiveQuery::with()|with()]] 的区别是 前者连接主模型类和关联模型类的数据表来检索主模型, 而后者只查询和检索主模型类。 检索主模型
由于这个区别,你可以应用只针对一条 JOIN SQL 语句起效的查询条件。 如,通过关联模型的查询条件过滤主模型,如前例, 可以使用关联表的列来挑选主模型数据,
当使用 [[yii\db\ActiveQuery::joinWith()|joinWith()]] 方法时可以响应没有歧义的列名。 In the above examples, we useitem.id
and order.id
to disambiguate the id
column references 因为订单表和项目表都包括 id
列。
当连接关联关系时,关联关系默认使用即时加载。你可以 通过传参数 $eagerLoading
来决定在指定关联查询中是否使用即时加载。
默认 [[yii\db\ActiveQuery::joinWith()|joinWith()]] 使用左连接来连接关联表。 你也可以传 $joinType
参数来定制连接类型。 你也可以使用 [[yii\db\ActiveQuery::innerJoinWith()|innerJoinWith()]]。
Yii2 分页
控制器 CommentController 里面的任意一个方法,在这里我的方法是 actionComment();
- use yii\data\Pagination;
- use app\models\Comment;
- public function actionComment(){
- $data = Comment::find()->andWhere(['id' => '10']);
- $pages = new Pagination(['totalCount' =>$data->count(), 'pageSize' => '2']);
- $model = $data->offset($pages->offset)->limit($pages->limit)->all();
- return $this->render('comment',[
- 'model' => $model,
- 'pages' => $pages,
- ]);
- }
view 里面的代码
- <?php
- use yii\widgets\LinkPager;
- ?>
- foreach($model as $key=>$val)
- {
- 这里就是遍历数据
- }
- <?= LinkPager::widget(['pagination' => $pages]); ?>
in() 操作
SELECT * FROM `categ_price` WHERE `id` IN (9, 11)
- $categ_price_id=[9>1,11=>3]
- $categPriceModel= \common\models\CategPrice::find()->where(['id' =>array_keys($categ_price_id)])->all(); #>where(['id' => [1, 2, 3]])
not in() 操作
SELECT * FROM `shop` WHERE (status=1) AND (`id` NOT IN (88, 93))
- $shopModel= Shop::find()->where('status=1')->andWhere(['not in','id',[88,98]])->all();
Yii2 数据查询的更多相关文章
- Django models .all .values .values_list 几种数据查询结果的对比
Django models .all .values .values_list 几种数据查询结果的对比
- MVC实用架构设计(三)——EF-Code First(4):数据查询
前言 首先对大家表示抱歉,这个系列已经将近一个月没有更新了,相信大家等本篇更新都等得快失望了.实在没办法,由于本人水平有限,写篇博客基本上要大半天的时间,最近实在是抽不出这么长段的空闲时间来写.另外也 ...
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...
- SharePoint服务器端对象模型 之 使用CAML进展数据查询
SharePoint服务器端对象模型 之 使用CAML进行数据查询 一.概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列 ...
- .NET应用架构设计—面向查询服务的参数化查询设计(分解业务点,单独配置各自的数据查询契约)
阅读目录: 1.背景介绍 2.对业务功能点进行逻辑划分(如:A.B.C分别三个业务点) 2.1.配置映射关系,对业务点配置查询契约(构造VS插件方便生成查询契约) 2.2.将配置好的映射策略文件放在调 ...
- 6、SQL Server 数据查询
一.使用SELECT检索数据 数据查询是SQL语言的中心内容,SELECT 语句的作用是让数据库服务器根据客户要求检索出所需要的信息资料,并按照规定的格式进行整理,返回给客户端. SELECT 语句的 ...
- SQL Server 的表数据简单操作(表数据查询)
--表数据查询----数据的基本查询-- --数据简单的查询--select * | 字段名[,字段名2, ...] from 数据表名 [where 条件表达式] 例: use 商品管理数据库 go ...
- asp.net mvc 数据查询赋值到文本框中
大家做了很多文本框查询并且赋值回来 1.先是把数据对象查询结果后台,然后把对象赋值给对象在赋值回来前台页面 2.使用@html helerper 数据查询,使用 ViewContext.RouteDa ...
- 数据库==>>数据查询基础
数据查询基础 还好吗?几天不见,甚是思念呀!笑对人生,好好生活,快快乐乐的迎接我们的美好未来吧! 好吧!抒情结束,我们一起来学习一下我们今天的主题:数据查询基础,很有意思哟.让我们来感受它的魅力吧! ...
随机推荐
- spring mvc 项目聚合
创建一个maven 项目当父项目 创建时选择默认就可以 创建完成后 修改 pom.xml文件 把 packaging 的war改为pom <modelVersion>4.0.0</ ...
- TCP协议中的三次握手和四次挥手(图解)
建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...
- ResourceHacker(4.5.30)单文件绿色汉化版
经常编译软件的人,肯定会使用一些编译和反编译的工具,ResourceHacker作为一款资源编译工具,非常的小巧好用,ResourceHacker没有任何广告,支持打开.exe..dll..scr.. ...
- js中let和var定义变量的区别
let变量之前没见过,刚遇到,探探究竟. 以下转自:http://blog.csdn.net/nfer_zhuang/article/details/48781671 声明后未赋值,表现相同 (fun ...
- c# cache 缓存
System.Web.Caching简介 /// <summary> /// 创建随机字符串 /// </summary> /// <returns></re ...
- Configure Security Settings for Remote Desktop(RDP) Services Connections
catalogue . Configure Server Authentication and Encryption Levels . Configure Network Level Authenti ...
- IntelliJ IDEA 常用设置讲解
说明 IntelliJ IDEA 有很多人性化的设置我们必须单独拿出来讲解,也因为这些人性化的设置让我们这些 IntelliJ IDEA 死忠粉更加死心塌地使用它和分享它. 常用设置 IntelliJ ...
- Android开发笔记之《远程控制(MQTT|mosquitto) && (ProtocalBuffer | GRPC)》
Android推送方案分析(MQTT/XMPP/GCM): http://www.open-open.com/lib/view/open1410848945601.htmlMQTT官网: http:/ ...
- UIScrollView的基本使用
UIScrollView的用法很简单 将需要展示的内容添加到UIScrollView中 设置UIScrollView的contentSize属性,告诉UIScrollView所有内容的尺寸,也就是告诉 ...
- Navigation Bar options for Android (based on photosomething project)
1, Tab控件即标签页,可以在一页中切换显示n页内容,要使用此效果,需要用到TabHost和Tabwidget类.(过时了?) Tab控件具有两种实现过程,一是在同一个Activity中切换显示不同 ...