1、数据集
数据库的查询结果也就是数据集,数据集的类型是一个二维数组,如果要判断是否为空,不能直接使用empty,而必须使用数据集对象的isEmpty方法判断
模型查询出来的是数据集,toArray()方法可转换成数组
DB查询出来的二维数组可以为数据集可以为数组,在database.php中修改配置:
'resultset_type' => 'array', //数组
'resultset_type' => 'collection', //数据集
2、模型查询的结果是一个对象
将对象转换成数组,使用toArray有可能无效,可以使用json_decode(json_encode(对象,true))来转换成数组
3、DB查询和模型查询的区别
他们查询的结果都是数据集,但是模型查询出来是对象,Db查询是数组
4、初始化方法initialize
控制器类继承了系统控制器基类(thinkController)的话,才可以定义控制器初始化方法initialize,
该方法会在调用控制器的方法之前首先执行
5、模板资源定位
在template.php配置文件里:
'tpl_replace_string' => [
'__STATIC__' => '/static',
'__LAYUI__' => '/static/layui',
],
6、获取项目路径
5.1版本取消了所有的系统常量,原来的系统路径变量改为使用Env类获取:
use think\facade\Env;
// 获取应用目录(不区分大小写)
echo Env::get('app_path');
// 或者
echo Env::get('APP_PATH');
//系统函数
env('root_path') 相当于 /www/wwwroot/ss/
tp5和tp6通用:
app()->getRootPath(); 相当于 env('root_path');
7、获取某个字段或者某个列的值
User::where('id',10)->value('name');
User::where('status',1)->column('id'); <=> array_column(二维数组,'id');
注意:获取列的值是一个一维数组,以id的值为一维数组的值,没有索引
8、var_dump和halt打印结果分析
var_dump打印的结果是数据类型+数据结果的展示,能展示所有的返回内容
halt打印的结果如果是一个数据集对象,会将该数据集结果显示为数组
如果要判断数据类型,推荐使用var_dump打印结果
9、return
TP框架的return返回数据,能够将数据集为空的对象转化为空数组
10、select
field('sum(price) price') 能直接取求和字段的值
fetchSql()->select() 等于 select(false) 不直接输出,打印SQL语句
11、执行原生SQL进行操作
query 用于查询 其他的用execute
插入记录
$result = Db::execute('insert into sb_ad (ad_name, ad_content ,status) values (1, "456",1)');
更新记录
$result = Db::execute('update sb_ad set ad_name = "framework" where ad_id = 1 ');
查询数据
$result = Db::query('select * from sb_ad where ad_id = 1');
删除数据
$result = Db::execute('delete from sb_ad where ad_id = 2 ');
其它操作
显示数据库列表
$result = Db::query('show tables from tpshop1');
清空数据表
$result = Db::execute('TRUNCATE table sb_ad');
12、where多条件:
tp5.0写法:
$where = ['id' => 1,'name' => 'zhangsan'];
$where['create_time'][] = ['>',$post['startTime']];
tp5.1写法:
$where = [
['id','=',1],
['name','=','张三']
];
$where[] = ['create_tiem','>=',$post['startTime']];
13、根据ID数组获取表里的所有姓名
$ids = [1,2,3,4];
Db::name('user')->where(['id' => $ids])->column('username');
这样就可以根据对应ID数组获取对应的姓名数组了
14、TP自带分页paginate()
paginate方法必须传page和limit参数,否则page永远都是1
不带参数分页:
$list = Db::name('user')->paginate(10);
带参数分页(推荐):
$list = Db::name('user')->paginate(10,false,['query' => request()->param()]);
说明:
['query' => request()->param()],有多少个参数会自动给你加上,不用一个个参数手写上去['query' => ['cate_id' => $cate_id,'keyword' => $keyword]],如果不加参数2和参数3可能会导致搜索条件丢失
15、路由
文件位置:route目录下route.php文件:
Route::rule('reply','index/Index/reply','GET|POST');
说明:第一个参数为域名/参数名,第二个参数为index模块下Index控制器reply方法,第三个参数为请求方法
16、leftJoin连接出现数据增加,有重复数据
是因为join连接的表有一对多的关系,join连接只支持一对一关联
17、session
赋值作用域:session('name','value','作用域');
取值作用域:session('name','','作用域');
删除作用域中的session:session('name',null,'作用域');
清除作用域所有seesion:session(null,'作用域');
18、获取器
模型设置对某字段设置了获取器之后,会在查询之后对数据进行转化
19、模型添加/更新 [ tp6 ]
tp6的save方法如果有where参数则表示更新,没有则表示新增
save新增的时候是默认开启allowField的,自动过滤非数据表中的字段
save更新的时候没有开启allowField
自动识别(推荐使用):
新增:实例化模型调用save
更新:查询数据后调用save
20、模型关联
//一个文章对应多个评论
public function comments()
{
return $this->hasMany(CommentModel::class,'article_id','id');
}
with:将关联表的数据查出来一起返回
(new ArticleModel)->with('comments')->select()->toArray();
如果要对关联模型进行约束(限制关联模型的显示结果),可以使用闭包的方式
(new ArticleModel())->with(['comments' => function($query){
//对关联模型得查询结果进行筛选
$query->where('article_id','>',1);
}])->select()->toArray();
withCount:关联数量统计
(new ArticleModel)->withCount(['comments' => 'comment_count'])->select()->toArray();
has:根据关联数量条件查询当前模型对象
(new ArticleModel)->has('comments','>',2)->select()->toArray();
hasWhere:根据关联模型的条件查询当前模型对象
(new ArticleModel)->hasWhere('comments',['status' => 1])->select()->toArray();