# **Query**

**查询一个数据**

find 方法返回数组,查询结果不存在,返回 null

~~~

// table方法必须指定完整的数据表名

\think\Db::table('think_user')->where('id',1)->find();

~~~

**查询多条数据**

select 方法根据`resultset_type`返回数组或者数据集类,查询结果不存在,返回空数组

~~~

\think\Db::name('user')->where('status',1)->select();

~~~

### **值和列查询**

**查询某个字段的值**

> value 方法 返回查询字段的值,查询结果不存在,返回 null

~~~

// 返回某个字段的值

\think\Db::table('think_user')->where('id',1)->value('name');

~~~

**查询某一列的值**

> column 方法 返回数组,查询结果不存在,返回空数组[]

~~~

// 返回数组

\think\Db::table('think_user')->where('status',1)->column('name');

// 指定索引

\think\Db::table('think_user')->where('status',1)->column('name','id');

\think\Db::table('think_user')->where('status',1)->column('id,name'); // 同tp3的getField

~~~

### **数据分批处理**

chunk 方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包,该方法在编写处理大量数据库记录的时候非常有用

~~~

//每次处理 100 个用户记录

\think\Db::table('think_user')->chunk(100, function($users) {

foreach ($users as $user) {

//

}

});

// 或者交给回调方法myUserIterator处理

\think\Db::table('think_user')->chunk(100, 'myUserIterator');

//可以通过从闭包函数中返回false来中止对数据集的处理:

\think\Db::table('think_user')->chunk(100, function($users) {

// 处理结果集...

return false;

});

//也支持在chunk方法之前调用其它的查询方法

\think\Db::table('think_user')->where('score','>',80)->chunk(100, function($users) {

foreach ($users as $user) {

//

}

});

//chunk方法的处理默认是根据主键查询,支持指定字段

\think\Db::table('think_user')->chunk(100, function($users) {

// 处理结果集...

return false;

},'create_time');

//chunk方法支持指定处理数据的顺序

\think\Db::table('think_user')->chunk(100, function($users) {

// 处理结果集...

return false;

},'create_t

~~~

## **Model**

记得引用命名空间

### **获取单个数据**

>[danger]如果你是在模型内部,请不要使用`$this->name`的方式来获取数据,请使用`$this->getAttr('name')`替代。

`get`或者`find`方法(虽然find是Query里的方法)返回的是当前模型的对象实例,可以使用模型的方法。

~~~

取出主键为1的数据

$user = User::get(1);

echo $user->name;

// 使用数组查询

$user = User::get(['name' => 'thinkphp']);

// 使用闭包查询

$user = User::get(function($query){

$query->where('name', 'thinkphp');

});

echo $user->name;

$user = new User();

// 实例化模型后调用查询方法

$user->where('name', 'thinkphp')->find();

~~~

### **获取多个数据**

模型的`all`方法或者`select`(虽然select是QUery类里的)方法返回的是一个包含模型对象的二维数组或者数据集对象。设置返回类型参看数据集章节

~~~

// 根据主键获取多个数据

$list = User::all('1,2,3');

// 或者使用数组

$list = User::all([1,2,3]);

foreach($list as $key=>$user){

echo $user->name;

}

//数组方式和闭包方式的数据查询的区别在于,数组方式只能定义查询条件,闭包方式可以支持更多的连贯操作,包括排序、数量限制等。

// 使用数组查询

$list = User::all(['status'=>1]);

// 使用闭包查询

$list = User::all(function($query){

$query->where('status', 1)->limit(3)->order('id', 'asc');

});

foreach($list as $key=>$user){

echo $user->name;

}

$user = new User();

//在实例化模型后调用查询方法只能用select

$user->where('name', 'thinkphp')

->limit(10)

->order('id', 'desc')

->select();

~~~

### **获取某个字段或者某个列的值**

>[danger]注意`value`和`column`方法返回的不再是一个模型对象实例,而是单纯的值或者某个列的数组。

~~~

// 获取某个用户的积分

User::where('id',10)->value('score');

// 获取某个列的所有值

User::where('status',1)->column('name');

// 以id为索引

User::where('status',1)->column('name','id');

User::where('status',1)->column('id,name'); // 同tp3的getField

~~~

### **动态查询**

::getBy字段名()

~~~

// 根据name字段查询用户

$user = User::getByName('thinkphp');

// 根据email字段查询用户

$user = User::getByEmail('thinkphp@qq.com');

~~~

## 通过Query类查询

当模型以静态方法的形式调用Query的链式操作方法时,自动转为Query数据库查询

~~~

User::where('id','>',10)->select();

User::where('name','thinkphp')->find();

//如果不是链式方法则后面不能在跟任何方法,如:

//分批处理

User::chunk(100,function($users){

foreach($users as $user){

// 处理user模型对象

}

});

~~~

## 查询缓存

`get`方法和`all`方法的第三个参数表示是否使用查询缓存,或者设置缓存标识。

由于第二个参数是关联预载入定义,`V5.0.6+`版本开始,可以直接在第二个参数传入true表示开启查询缓存。

~~~

$user = User::get(1,'',true);

$list = User::all('1,2,3','',true);

~~~

1.php查询数据,数据查询 · thinkphp5 · 看云相关推荐

  1. php 数据中心,数据层 · Thinkphp 独立数据中心使用手册 · 看云

    [TOC] ## 概述 数据层是用来直接操作数据表的,数据层的方法都是原子的操作,应避免在数据层中处理具体业务流程,具体业务流程应在逻辑层进行处理. ## 数据层类定义 数据层类通常需要继承核心的\t ...

  2. MyBatis中使用流式查询避免数据量过大导致OOM

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天mybatis查询数据库中大量的数据,程序抛出: java.lang.OutOfMemoryError: Java heap s ...

  3. 关于SQL查询效率,100w数据,查询只要1秒

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询 ...

  4. [转]海量查询的数据优化

    一.因情制宜,建立"适当"的索引 建立"适当"的索引是实现查询优化的首要前提. 索引(index)是除表之外另一重要的.用户定义的存储在物理介质上的数据结构.当 ...

  5. 大数据druid查询不支持分页_Klin、Druid、ClickHouse核心技术对比

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 大数据技术与架构点击右侧关注,大数据开发领域最强公众号! 大数据真好玩点击右侧关注,大数据真好玩! ...

  6. java一次查询900w数据_一次SQL查询优化原理分析(900W+数据,从17s到300ms)

    有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: ...

  7. mysql 二进制查询_MySql如何插入和查询二进制数据_MySQL

    bitsCN.com MySql如何插入和查询二进制数据 mysql二进制 Mysql:bit类型的查询与插入 mysql有种字段类型是bit. 1.如何插入呢? 它的插入必须采用: 可以使用b'va ...

  8. 搞懂 SQL 查询优化原理分析,秒速处理大数据量查询

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到 ...

  9. mysql 查询两张表结构相同的数据库_利用反射处理多个表结构相同的数据的查询和数据库表的关联...

    最近做一个项目,需要对人口数据进行查询,但是人口数据分布在不同的街道表中,首先进行了数据表结构的统一,每个数据表以街道名开头,然后其他的名字都一样 前期将各个表中的字段也进行了统一 抽象出一张字典表 ...

最新文章

  1. python实现gauss-seidel迭代公式_python实现高斯(Gauss)迭代法的例子
  2. 什么是边缘计算(Edge AI)?
  3. 新的一年,,,新的生活
  4. dev c++怎么调试_「正点原子NANO STM32开发板资料连载」第十八章 USMART 调试组件...
  5. SpringCloud的学习记录(1)
  6. hive-jdbc/odbc的解读和看法
  7. markDown用这一招实现图片并排显示
  8. python学习笔记__Python的安装
  9. Visual Studio 2008 安装失败(“Web 创作组件”)安装失败
  10. ms03-026漏洞原理与复现
  11. Redis(1)——NoSQL数据库简介
  12. 网易云音乐的焦虑 暗藏在上市后的首份财报里
  13. Unity 随机生成中文名字
  14. 贴吧怎么发帖,发防删图出现审核怎么办?
  15. python邮件合并的基本操作步骤_邮件合并的基本操作步骤 - 卡饭网
  16. 年审是当月还是当天_年审年检7月当月审可以吗
  17. 2022/06/06 day07:Scanner类、Random类、ArrayList 类
  18. vue引入外部js文件(第三方js工具或者jq库)
  19. IEEE 802.1AS-2011 第七章 桥接局域网的时间同步模型
  20. 诺基亚Vertu Constellation root教程_方法

热门文章

  1. linux下php安装
  2. UVa 140 Bandwidth【枚举排列】
  3. WCF学习笔记(2)——独立WCF服务
  4. Node项目实战开发-博客系统
  5. 机器学习中的数学(二)--梯度下降法
  6. 修改oracle 的dbname,在oracle 10g上修改dbname的实验
  7. php面试编程题_一位资深php程序员在北京的面试30个题目
  8. 7-103 牛几 (10 分)
  9. 7-58 肿瘤诊断 (30 分)
  10. ghost网络克隆功能实现【批量】计算机操作【系统的安装】,网络学习(三十)通过ghost的网络克隆功能实现操作系统的分发...