ThinkPHP
数据库与模型
连接数据库
ThinkPHP采用内置抽象层将不同的数据库操作进行封装处理
数据抽象层基于PDO模式,无须针对不同的数据库编写相应的代码
在根目录下的config下的database.php可以设置数据库连接信息
type属性默认支持的数据库有mysql,sqlite,pgsql,sqlsrv
先在config下的database.php中,根据自己的情况设置好
之后创建一个DataTest的类,这个是一个不结合model处理的
DataTest.php1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace app\index\controller;
use think\Controller;
use think\Db;
class DataTest extends Controller
{
public function index(){
return 'index';
}
public function getNoModelData()
{
$data=Db::table("student")->select();
return json($data);
}
}
浏览器上就可以正常看到数据了,建议用firefox查看
模型定义
在MVC中,已经使用过Controller,View,Model
Model就是模型,就是处理和配置数据库的相关信息
在根目录创建model文件夹,并创建Student.php;该文件需要与数据库表名一致
Student.php1
2
3
4
5
6
7
8
9
10<?php
namespace app\index\model;
use think\Model;
class Student extends Model
{
}
继承model之后,什么都不用写,实际上它已经是个数据库的表了
回到DataTest.php中修改1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
namespace app\index\controller;
use app\index\model\Student;
use think\Controller;
use think\Db;
class DataTest extends Controller
{
public function index(){
return 'index';
}
public function getNoModelData()
{
$data=Db::table("student")->select();
return json($data);
}
public function getModelData(){
$data= Student::select();
return json($data);
}
}
URL访问getmodeldata,发现就出来了,比没用model要简单很多
如果想要知道查询的流程,可以在app.php配置文件中打开应用Trace,修改完之后就不能使用json输出了,需要html输出,所以修改DataTest.php
1 |
|
将return注释掉,再访问之后右下角就可以看到具体的流程了
查询数据
基本查询
Db::table()中table必须指定完整数据表
如果只希望查询一条语句,可以使用find()方法
Db::getLastSql()方法,可以得到最近一条SQL查询的原生语句
想指定数据查询,可以使用where()方法
没有查询到任何值,则会返回null
使用findOrFail()方法可以查询一条数据,在没有数据时抛出一个异常;使用findOrEmpty()也可以查询一条数据,在没有数据时返回一个空数组
查询多列使用select()方法,select()以数组形式返回,与find同样有selectOrFail()和selectOrEmpty(),同样是以数组形式返回
通过value方法可以查询指定字段的单值,没有返回null
column()方法可以查询指定列的值(多个),没有返回空数组
find()
DataTest1.php1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace app\index\controller;
use app\index\model\Student;
use think\Controller;
use think\Db;
class DataTest1 extends Controller
{
public function index(){
$data=Db::table('student')->find();
return json($data);
}
}
运行结果1
{"sno":"18008001","sname":"刘昊然","ssex":null,"sage":23,"sdept":"IS"}
默认查询第一条数据,还可以进行指定,指定的标准是根据主键来进行查询的,例如查询第二个同学的数据,第二个同学学号为18008002,为主键
1 |
|
运行结果1
{"sno":"18008002","sname":"张杰","ssex":null,"sage":21,"sdept":"IS"}
getLastSql()
1 |
|
运行结果1
SELECT * FROM `student` WHERE `sno` = 18008002 LIMIT 1
这个可以检测一下自己刚才的操作对应的sql语句
where()
1 |
|
由于ThinkPHP的优化,可以不采用这种链式查询,直接在find()里指定也一样,但是find()中指定的只能为简单的条件查询,且find()只能以主键作为查询条件
运行结果1
{"sno":"18008010","sname":"杨紫","ssex":null,"sage":26,"sdept":"IS"}
value()
1 |
|
运行结果1
"张立"
column()
1 |
|
运行结果1
["18008001","18008002","18008010","201215121","201215122","201215123","201215124","201215125"]
还可以将sno作为列值的索引1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace app\index\controller;
use app\index\model\Student;
use think\Controller;
use think\Db;
class DataTest2 extends Controller
{
public function index(){
// $data=Db::name('student')->column('sno');
$data=Student::column('sname','sno');
return json($data);
}
}
运行结果1
{"18008001":"刘昊然","18008002":"张杰","18008010":"杨紫","201215121":"李勇","201215122":"刘晨","201215123":"王敏","201215124":"宋洁","201215125":"张立"}
链式查询
前面学习的通过指向符号
->
多次连续调用的方法被称为链式查询当Db::name(‘user’)时,返回数据库对象,即可连缀数据库对应的方法
每次执行一个数据库查询方法时,比如where(),还将返回数据库对象
只要还是数据库对象,那么就可以一直使用指向符号进行链式查询
如果想要最后得到结果,那么可以使用find(),select()方法结束查询
find()和select()方法放在最后是为了结束查询,不属于链式查询方法
想要获取数据库对象,可以使用print_r()
方法
1 |
|
访问之后,可以看到数据库的连接对象的各种方法和信息
1 |
|
运行结果1
Array ( [0] => Array ( [sno] => 18008002 [sname] => 张杰 [ssex] => [sage] => 21 [sdept] => IS ) )0.044063sShowPageTrace
更多查看
https://www.kancloud.cn/thinkphp/thinkphp5_quickstart/478293
增删改操作
新增数据
- 使用insert()方法向数据表添加一条数据
1 |
|
运行结果就添加了一行数据,但是这样就算新增成功了也不会有什么提示,所以可以这样改一下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace app\index\controller;
use app\index\model\Student;
use think\Controller;
use think\Db;
class DataTest4 extends Controller
{
public function index(){
$data=['sno'=>18008003,
'sname'=>'51nd0re1',
'ssex'=>'男',
'sage'=>20,
'sdept'=>'DBA'
];
$flag=Db::name('student')->insert($data);
if ($flag) return '新增成功';
}
}
运行结果还是一样,只不过多输出了一句新增成功,insert()方法成功执行会返回1
使用insertGetId()方法,可以在新增成功后返回当前数据ID
使用insertAll()方法,可以批量添加数据1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace app\index\controller;
use app\index\model\Student;
use think\Controller;
use think\Db;
class DataTest4 extends Controller
{
public function index(){
$dataAll=[
['sno'=>18008003,
'sname'=>'51nd0re1',
'ssex'=>'男',
'sage'=>20,
'sdept'=>'IS'
],
['sno'=>18008004,
'sname'=>'啦啦啦',
'ssex'=>'男',
'sage'=>22,
'sdept'=>'DBA'
]
];
$flag=Db::name('student')->insertAll($dataAll);
if ($flag) return '新增成功';
}
}
这样就一次性添加了两条数据
修改数据
使用update()方法来修改数据,修改成功返回1,修改失败返回01
2
3
4
5
6
7
8
9
10
11public function updateTest(){
$data=[
'sname'=>'小兲'
];
$flag=Db::name('student')->where('sno','18008004')->update($data);
if ($flag){
return '修改成功';
} else {
return '修改失败';
}
}
运行结果1
修改成功
同时数据库内容也变了
如果数组中包含了主键,那么就可以不使用where直接修改1
2
3
4
5
6
7
8
9
10
11
12public function updateTest(){
$data=[
'sno'=>18008003,
'sname'=>'西巴哥'
];
$flag=Db::name('student')->update($data);
if ($flag){
return '修改成功';
} else {
return '修改失败';
}
}
删除数据
使用delete()来进行删除,返回影响行数,失败返回01
2
3
4
5
6
7
8public function deleteTest(){
$flag=Db::name('student')->delete(18008004);
if ($flag){
return '删除成功';
}else{
return '删除失败';
}
}
这样就直接删除了,直接根据主键删除
还可以删除多条记录1
2
3
4
5
6
7
8public function deleteTest(){
$flag=Db::name('student')->delete([18008001,18008002]);
if ($flag){
return '删除成功';
}else{
return '删除失败';
}
}
效果一样,不演示了
还可以通过where()来删除1
2
3
4
5
6
7
8public function deleteTest(){
$flag=Db::name('student')->where('sno','18008001')->delete();
if ($flag){
return '删除成功';
}else{
return '删除失败';
}
}
如果想要删除数据表所有的数据只需要通过参数true就行1
2
3
4
5
6
7
8public function deleteTest(){
$flag=Db::name('student')->delete(true);
if ($flag){
return '删除成功';
}else{
return '删除失败';
}
}
自行尝试