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笔记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)