ThinkPHP:Db类和模型的正确使用
ThinkPHP  /  管理员 发布于 8年前   381
发现很多开发者在使用ThinkPHP5.*的时候不明白Db和模型的正确使用姿势,尤其是在5.1版本里面,如果你没有使用下面的正确姿势,有很大可能性会踩坑。
Db的正确姿势
下面是官方推荐的Db类用法(也就是每次都是静态方法调用)
// 查询单个数据Db::name('user')->where('id', 1)->find();// 查询多个数据Db::name('user')->where('id', '>', 1)->select();// 写入新的数据Db::name('user')->insert(['name' => '张三']);// 更新数据Db::name('user')->where('id', 1)->update(['name' => '李四']);// 删除数据Db::name('user')->delete(1);
很多开发者为了简化代码,喜欢使用下面的代码。
但是,永远不要在5.1中使用下面的代码!
// 错误的用法$user = Db::name('user');// 查询单个数据$user->where('id', 1)->find();// 查询多个数据$user->where('id', '>', 1)->select();// 写入新的数据$user->insert(['name' => '张三']);// 更新数据$user->update(['name' => '李四']);// 删除数据$user->delete(1);
即便是使用助手函数仍然不建议!
// 仍然是错误的用法// 查询单个数据db('user')->where('id', 1)->find();// 查询多个数据db('user')->where('id', '>', 1)->select();// 写入新的数据db('user')->insert(['name' => '张三']);// 更新数据db('user')->update(['name' => '李四']);// 删除数据db('user')->delete(1);
很多开发者可能会奇怪,为什么是错误的用法呢?我使用的结果明明都没问题啊?这只是说明你还没踩坑罢了。
真正的原因,是5.1版本每次查询后是不会清空前次(5.0则会每次清空)的查询条件的,所以下面的用法是有效的。
$user = Db::name('user');// 查询分数大于80分的用户总数$count = $user->where('score', '>', 80)->count();// 查询分数大于80分的用户数据$user->select();
看到这里你应该明白了,当你使用的是同一个数据库查询对象实例的话,查询条件是始终会保留的(也就是会导致后面的查询条件错乱),而如果你使用助手函数或者手动实例化后多次操作都是相同的对象实例,除非你像下面一样手动清除。
$user = Db::name('user');// 查询分数大于80分的用户总数$count = $user->where('score', '>', 80)->count();// 清除查询条件(但不包括排序或者字段等信息)$user->removeOption('where');// 查询所有用户数据 并按分数倒序排列 $user->order('score', 'desc')->select();// 清除所有查询条件$user->removeOption();// 查询分数等于100的用户$user->where('score', 100)->select();
最佳实践:每次使用全新的Db静态查询
模型的正确姿势
模型的设计其实和Db一样,基本上不需要手动进行实例化。
// 写入新的数据$user = User::create(['name' => '张三']);// 更新数据$user->update(['name' => '李四']);// 查询单个数据$user = User::get(1);// 删除当前模型数据$user->delete();
上面的代码中,我们没有使用任何的实例化代码,都是使用静态方法操作。模型的实例化工作是由系统在查询或者写入数据的时候自动完成的。如果你自己手动实例化模型的话,会造成模型的重复实例化开销。
不建议的用法:
$user = new User;// 写入新的数据$user->name = '张三';$user->save();
$user = new User;$user->find(1);echo $user->name;
建议用法:
// 写入新的数据User::create(['name' => '张三']);$user = User::get(1);echo $user->name;
所以,请不要手动实例化模型,也不建议使用model助手函数。
最佳实践:模型查询和创建都使用静态方法
现在,你明白Db类和模型使用的正确姿势了么?
,有大量免费的ThinkPHP入门教程,欢迎大家学习!
本文转自:https://blog.thinkphp.cn/810719
以上就是ThinkPHP:Db类和模型的正确使用的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号