ThinkPHP

数据库与模型

连接数据库

  1. ThinkPHP采用内置抽象层将不同的数据库操作进行封装处理

  2. 数据抽象层基于PDO模式,无须针对不同的数据库编写相应的代码

  3. 在根目录下的config下的database.php可以设置数据库连接信息

  4. type属性默认支持的数据库有mysql,sqlite,pgsql,sqlsrv

先在config下的database.php中,根据自己的情况设置好

之后创建一个DataTest的类,这个是一个不结合model处理的

DataTest.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php


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查看

模型定义

  1. 在MVC中,已经使用过Controller,View,Model

  2. Model就是模型,就是处理和配置数据库的相关信息

  3. 在根目录创建model文件夹,并创建Student.php;该文件需要与数据库表名一致

Student.php

1
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
<?php


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
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
<?php


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);
}
}

将return注释掉,再访问之后右下角就可以看到具体的流程了

查询数据

基本查询

  1. Db::table()中table必须指定完整数据表

  2. 如果只希望查询一条语句,可以使用find()方法

  3. Db::getLastSql()方法,可以得到最近一条SQL查询的原生语句

  4. 想指定数据查询,可以使用where()方法

  5. 没有查询到任何值,则会返回null

  6. 使用findOrFail()方法可以查询一条数据,在没有数据时抛出一个异常;使用findOrEmpty()也可以查询一条数据,在没有数据时返回一个空数组

  7. 查询多列使用select()方法,select()以数组形式返回,与find同样有selectOrFail()和selectOrEmpty(),同样是以数组形式返回

  8. 通过value方法可以查询指定字段的单值,没有返回null

  9. column()方法可以查询指定列的值(多个),没有返回空数组

find()

DataTest1.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php


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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php


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(18008002);
return json($data);
}

}

运行结果

1
{"sno":"18008002","sname":"张杰","ssex":null,"sage":21,"sdept":"IS"}

getLastSql()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php


namespace app\index\controller;
use app\index\model\Student;
use think\Controller;
use think\Db;

class DataTest2 extends Controller
{

public function index(){
$data=Db::table('student')->find(18008002);
return Db::getLastSql();
}

}

运行结果

1
SELECT * FROM `student` WHERE `sno` = 18008002 LIMIT 1

这个可以检测一下自己刚才的操作对应的sql语句

where()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php


namespace app\index\controller;
use app\index\model\Student;
use think\Controller;
use think\Db;

class DataTest2 extends Controller
{

public function index(){
$data=Db::table('student')->where('sno',18008010)->find();
return json($data);
}

}

由于ThinkPHP的优化,可以不采用这种链式查询,直接在find()里指定也一样,但是find()中指定的只能为简单的条件查询,且find()只能以主键作为查询条件

运行结果

1
{"sno":"18008010","sname":"杨紫","ssex":null,"sage":26,"sdept":"IS"}

value()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php


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')->where('sno',201215125)->value('sname');
return json($data);
}

}

运行结果

1
"张立"

column()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php


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');
return json($data);
}

}

运行结果

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
<?php


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":"张立"}

链式查询

  1. 前面学习的通过指向符号->多次连续调用的方法被称为链式查询

  2. 当Db::name(‘user’)时,返回数据库对象,即可连缀数据库对应的方法

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

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

  5. 如果想要最后得到结果,那么可以使用find(),select()方法结束查询

  6. find()和select()方法放在最后是为了结束查询,不属于链式查询方法

想要获取数据库对象,可以使用print_r()方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php


namespace app\index\controller;
use app\index\model\Student;
use think\Controller;
use think\Db;

class DataTest3 extends Controller
{

public function index(){
print_r(Db::name('student'));
}

}

访问之后,可以看到数据库的连接对象的各种方法和信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php


namespace app\index\controller;
use app\index\model\Student;
use think\Controller;
use think\Db;

class DataTest3 extends Controller
{

public function index(){
print_r(Db::name('student')->where('sno','18008002')->order('sno','desc')->select());
}

}

运行结果

1
Array ( [0] => Array ( [sno] => 18008002 [sname] => 张杰 [ssex] => [sage] => 21 [sdept] => IS ) )0.044063sShowPageTrace

更多查看
https://www.kancloud.cn/thinkphp/thinkphp5_quickstart/478293

增删改操作

新增数据

  • 使用insert()方法向数据表添加一条数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php


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'
];
Db::name('student')->insert($data);
}

}

运行结果就添加了一行数据,但是这样就算新增成功了也不会有什么提示,所以可以这样改一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php


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
<?php


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,修改失败返回0

1
2
3
4
5
6
7
8
9
10
11
public function updateTest(){
$data=[
'sname'=>'小兲'
];
$flag=Db::name('student')->where('sno','18008004')->update($data);
if ($flag){
return '修改成功';
} else {
return '修改失败';
}
}

运行结果
1
修改成功

同时数据库内容也变了
avatar

如果数组中包含了主键,那么就可以不使用where直接修改

1
2
3
4
5
6
7
8
9
10
11
12
public function updateTest(){
$data=[
'sno'=>18008003,
'sname'=>'西巴哥'
];
$flag=Db::name('student')->update($data);
if ($flag){
return '修改成功';
} else {
return '修改失败';
}
}

avatar

删除数据

使用delete()来进行删除,返回影响行数,失败返回0

1
2
3
4
5
6
7
8
public function deleteTest(){
$flag=Db::name('student')->delete(18008004);
if ($flag){
return '删除成功';
}else{
return '删除失败';
}
}

avatar
这样就直接删除了,直接根据主键删除

还可以删除多条记录

1
2
3
4
5
6
7
8
public function deleteTest(){
$flag=Db::name('student')->delete([18008001,18008002]);
if ($flag){
return '删除成功';
}else{
return '删除失败';
}
}

效果一样,不演示了

还可以通过where()来删除

1
2
3
4
5
6
7
8
public function deleteTest(){
$flag=Db::name('student')->where('sno','18008001')->delete();
if ($flag){
return '删除成功';
}else{
return '删除失败';
}
}

如果想要删除数据表所有的数据只需要通过参数true就行

1
2
3
4
5
6
7
8
public function deleteTest(){
$flag=Db::name('student')->delete(true);
if ($flag){
return '删除成功';
}else{
return '删除失败';
}
}

自行尝试