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