本文不是原创,摘抄自tp官网的建议,只为记录一下,方便使用的时候查阅
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();
看到这里你应该明白了,当你使用的是同一个数据库查询对象实例的话,查询条件是始终会保留的(也就是会导致后面的查询条件错乱)
模型的正确姿势
模型的设计其实和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
助手函数。
疑问
这里有同学可能会问了:
如果我在自定义的模型里面有一个方法fun,那调用的时候使用model(‘user’)->list(); 还是User::list()
对于这个问题,自定义方法一般都是动态的,一般的使用场景都是
$user = User::get(1);
$user->fun();
没有必要为查询数据增加方法,用查询范围和搜索器就可以了。
Comments