Thinkphp
Allen 2022-10-22 23:25:47 5397 1 0 0 0
Thinkphp,Thinkphp笔记,Thinkphp6学习笔记05:链接数据库,查询数据,数据库的链式查询,分批查询,游标查询

07,链接数据库

...

use thinkfacadeDb;
class Datatest{
	public function index(){
		// 打开数据库
		$user = Db::table("ty_user")->select();	
		// 完整写法:$user = Db::connect("mysql")->table("ty_user")->select();	
		return json($user);
	}
	public function demo(){
		// 打开默认数据库user表
		$user = Db::table("ty_user")->select();	
		// 完整写法:$user = Db::connect("mysql")->table("ty_user")->select();
		// 链接demo数据库
		$user = Db::connect("demo")->table("ty_user")->select();		
		return json($user);
	}
}
config-database.php中复制connections->mysql,粘贴改名为demo。

...

+++

模型初探

...

创建模型

namespace appmodel;
use thinkModel;
class User extends Model
{	
	//user继承模型基类,即可实现数据调用。
	//建上就连接数据库了

	//通过爱保护字段$connection,可以实现切换数据库
	protected $connection ="demo";
}

...

控制器端调用如下:

	public function getUser(){
		$user=User::select();
		return json($user);
	}

==

08,数据库的数据查询

一,单数据查询:find

1. Db::table()中table 必须指定完整数据表(包括前缀)﹔

2.如果希望只查询一条数据,可以使用find()方法,需指定 where条件;

$user = Db::table("ty_user")->->find();  //返回null

$user = Db::table("ty_user")->where ("user_id",901)->find(); //返回正常数据

3. 查看最近一条 sQL查询的原生语句;

Db::getLastsql()

5.使用findorFail()方法同样可以查询一条数据,在没有数据时抛出一个异常;

$user = Db::table('tp_user') ->where('id',1111)->findorFail();  //返回错误:表数据不存在

6.使用findorEmpty()方法也可以查询一条数据,但在没有数据时返回一个空数组;

$user = Db::table('tp_user') ->where('id',1111)->findorEmpty();  //返回[]

+++

二.数据集查询:select

1.想要获取多列数据,可以使用select()方法;

Db::table('tp_user")->select();

SELECT * FROM 'tp_user' 所有数据

2.多列数据在查询不到任何数据时返回空数组,使用selectorFail()抛出异常;

Db::table('tp_user')->where('id',1111)->select;

Db::table('tp_user')->where('id',1111)->selectorFail();

3.在select()方法后再使用toArray()方法,可以将数据集对象转化为数组;

$user=Db::table('tp_user')->select()->toArray();

dump($user);

4.当在数据库配置文件中设置了前缀,那么我们可以使用name()方法忽略前缀;

Db::name("user')->select();

三.其它查询

1.通过value()方法,可以查询指定字段的值(单个),没有数据返回null;

return Db::name('user')->where('id',27)->value('username');

2.通过colunm()方法,可以查询指定列的值(多个),没有数据返回空数组;

Db::name('user' )->column('username');

3.可以指定id作为列值的索引;

Db::name('user')->column('username','id');


4.如果处理的数据量巨大,成百上千那种,一次性读取有可能会导致内存开销过大;

5.为了避免内存处理太多数据出错,可以使用chunk()方法分批处理数据;

 比如,每次只处理100条,处理完毕后,再读取100条继续处理;

		Db::name('user')->chunk(3,function($users){			
			foreach ($users as $user){
				dump($user);
			}
			echo 1;
		});

7.可以利用游标查询功能,可以大幅度减少海量数据的内存开销,它利用了PHP生成器特性。每次查询只读一行,然后再读取时,自动定位到下一行继续读取;

		$cursor = Db::name("user")->cursor();
		foreach($cursor as $user) {
			dump($user);
			echo 1;
		}

...

===

09。数据库的链式查询

一.查询规则

1.前面课程中我们通过指向符号“->”多次连续调用方法称为:链式查询

2.当Db::name('user')时,返回查询对象(Query),即可连缀数据库对应的方法;

3.而每次执行一个数据库查询方法时,比如 where(),还将返回查询对象(Query);

4.只要还是数据库对象,那么就可以一直使用指向符号进行链式查询;

5.再利用find()、select()等方法返回数组(Array)或数据集对象(Colletion);

find()返回数组(Array)

select()返回数据集对象(Colletion);

6.而find()和 select()是结果查询方法(放在最后),并不是链式查询方法;

Db::name('user')->where('id',27)->order('id','desc')->find()

7.除了查询方法可以使用链式连贯操作,CURD操作也可以使用(后续课程研究);8.那么,有多少种类似where()的链式操作方法呢?打开手册瞄一下。

...

二.更多查询

1.如果多次使用数据库查询,那么每次静态创建都会生成一个实例,造成浪费;

2.我们可以把对象实例保存下来,再进行反复调用即可;

$userQuery = Db:: name ('user');

$dataFind = $userQuery->where('id', 27)->find() ;

$dataselect = $userQuery->select();


3.当同一个对象实例第二次查询后,会保留第一次查询的值;

$data1 = $userQuery->order('id','desc') ->select();

$data2 = $userQuery->select();

return Db:: getLastsql();

SELECT *FROM ^tp_user`ORDER BY ^id`DESC


4.使用removeoption()方法,可以清理掉上一次查询保留的值;

$userQuery->removeoption('order')->select();


Tag: Thinkphp Thinkphp笔记
评论
Allen#1Allen 2023-04-16 00:48:34(N) 链接地址

08->7

游标查询功能,利用了PHP生成器特性

生成器,是php5.5以后才有的功能

语言参考:https://www.php.net/manual/zh/language.generators.php

应用场景:读取超大文件

PHP开发很多时候都要读取大文件,比如csv文件、text文件,或者一些日志文件。这些文件如果很大,比如5个G。这时,直接一次性把所有的内容读取到内存中计算不太现实。

这里生成器就可以派上用场啦。简单看个例子∶读取text文件

使用生成器读取文件,第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的文字只有一行,大大的减小了内存r的使用

这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码。


+++

09,二,4

当同一个对象实例第二次查询后,会保留第一次查询的值;

可以使用removeoption()方法,无脑地清理掉上一次查询保留的值;

$UserQuery=Db::connect("tytest")->name('user');
$UserSelect=$UserQuery->where("user_id",1004)->order("user_id","desc")->select();
$data2 = $userQuery->select();
return Db:: getLastsql();
(此时返回仍然带where,order的sql)

$UserQuery=Db::connect("tytest")->name('user');
$UserSelect=$UserQuery->where("user_id",1004)->order("user_id","desc")->select();
//$UserSelect1=$UserQuery->removeOption("where")->select();  //清除where选项
//$UserSelect1=$UserQuery->removeOption("order")->select();  //清除order选项
$UserSelect1=$UserQuery->removeOption()->select();  //清除所有的选项
return Db:: getLastsql();
(此时返回不带选项的sql)

顶部     1/1 
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[Thinkphp]   ·   返回顶部