新增:
静态方法
还可以直接静态调用create方法创建并写入:
$user = User::create([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID
和save方法不同的是,create方法返回的是当前模型的对象实例。
create方法默认会过滤不是数据表的字段信息,可以在第二个参数可以传入允许写入的字段列表,例如:
// 只允许写入name和email字段的数据
$user = User::create([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
], ['name', 'email']);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID
支持replace操作,使用下面的方法:
$user = User::create([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
], ['name','email'], true);
新增数据的最佳实践原则:使用create方法新增数据,使用saveAll批量新增数据。
更新:
查找并更新
在取出数据后,更改字段内容后使用save方法更新数据。这种方式是最佳的更新方式。
$user = User::find(1);
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
save方法成功返回true,并只有当before_update事件返回false的时候返回false,有错误则会抛出异常。
对于复杂的查询条件,也可以使用查询构造器来查询数据并更新
$user = User::where('status',1)
->where('name','liuchen')
->find();
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
save方法更新数据,只会更新变化的数据,对于没有变化的数据是不会进行重新更新的。如果你需要强制更新数据,可以使用下面的方法:
$user = User::find(1);
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->force()->save();
这样无论你的修改后的数据是否和之前一样都会强制更新该字段的值。
如果要执行SQL函数更新,可以使用下面的方法
$user = User::find(1);
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->score = Db::raw('score+1');
$user->save();
删除
删除当前模型
删除模型数据,可以在查询后调用delete方法。
$user = User::find(1);
$user->delete();
delete方法返回布尔值
根据主键删除
或者直接调用静态方法(根据主键删除)
User::destroy(1);
// 支持批量删除多个数据
User::destroy([1,2,3]);
当destroy方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的
条件删除
还支持使用闭包删除,例如:
User::destroy(function($query){
$query->where('id','>',10);
});
或者通过数据库类的查询条件删除
User::where('id','>',10)->delete();
直接调用数据库的delete方法的话无法调用模型事件。
最佳实践
删除的最佳实践原则是:如果删除当前模型数据,用
delete方法,如果需要直接删除数据,使用destroy静态方法。
查询
获取单个数据
1.使用find()方法,通过主键(id)查询到想要的数据;
$user = UserModel::find(129);
returnjson($user)
2.也可以使用where()方法进行条件筛选查询数据;
$user = UserModel::where('username','辉夜')->find();
returnjson($user);
3.调用find()方法时,如果数据不存在则返回Null;
4.同上,还有findOrEmpty()方法,数据不存在返回空模型;
5.此时,可以后使用isEmpty()方法来判断,是否为空模型;
$user = UserModel::findOrEmpty(1111);
if($user->isEmpty()) {
echo '空模型,无数据!';
}
6.使用select([])方式,查询多条指定id的字段,不指定就是所有字段;
$user = UserModel::select([19,20,21]);
foreach ($user as $key=>$obj){
echo $obj->username;
}
7.模型方法也可以使用where等连缀查询,和数据库查询方式一样;
$user = UserModel::where('status', 1)->limit(5)->order('id', 'desc')->select();
8.获取某个字段value()或者某个列column()的值;
UserModel::where('id',79)->value('username');
UserModel::whereIn('id',[79,118,128])->column('username','id');
9.模型支持动态查询:getBy*,*表示字段名;
UserModel::getByUsername('辉夜');
UserModel::getByEmail('huiye@163.com');
10. 模型支持聚合查询:max、min、sum、count、avg等;
UserModel::max('price');
11. 使用chunk()方法可以分批处理数据,数据库查询时讲过,防止一次性开销过大;
UserModel::chunk(5, function ($users) {
foreach($users as $user) {
echo $user->username;
}
echo '<br>------<br>';
});
12. 可以利用游标查询功能,可以大幅度减少海量数据的内存开销,它利用了PHP 生 成器特性。每次查询只读一行,然后再读取时,自动定位到下一行继续读取;
foreach (UserModel::where('status', 1)->cursor() as $user) {
echo $user->username;
echo '<br>------<br>';
}
-------------------------------------------------------------------------------------------------------------------
获取单个数据的方法包括:
// 取出主键为1的数据
$user = User::find(1);
echo $user->name;
// 使用查询构造器查询满足条件的数据
$user = User::where('name', 'thinkphp')->find();
echo $user->name;


模型使用find方法查询,如果数据不存在返回Null,否则返回当前模型的对象实例。如果希望查询数据不存在则返回一个空模型,可以使用。
$user = User::findOrEmpty(1);
你可以用isEmpty方法来判断当前是否为一个空模型。
$user = User::where('name', 'thinkphp')->findOrEmpty();
if (!$user->isEmpty()) {
echo $user->name;
}
$user = User::where('name', 'thinkphp')->findOrEmpty(); if (!$user->isEmpty()) { echo $user->name; }
获取多个数据
取出多个数据:
// 根据主键获取多个数据
$list = User::select([1,2,3]);
// 对数据集进行遍历操作
foreach($list as $key=>$user){
echo $user->name;
}
要更多的查询支持,一样可以使用查询构造器:
// 使用查询构造器查询
$list = User::where('status', 1)->limit(3)->order('id', 'asc')->select();
foreach($list as $key=>$user){
echo $user->name;
}
查询构造器方式的查询可以支持更多的连贯操作,包括排序、数量限制等。


使用查询构造器
在模型中仍然可以调用数据库的链式操作和查询方法,可以充分利用数据库的查询构造器的优势。
例如:
User::where('id',10)->find();
User::where('status',1)->order('id desc')->select();
User::where('status',1)->limit(10)->select();
User::where('id',10)->find(); User::where('status',1)->order('id desc')->select(); User::where('status',1)->limit(10)->select();
获取某个字段或者某个列的值
// 获取某个用户的积分
User::where('id',10)->value('score');
// 获取某个列的所有值
User::where('status',1)->column('name');
// 以id为索引
User::where('status',1)->column('name','id');
value和column方法返回的不再是一个模型对象实例,而是纯粹的值或者某个列的数组。
动态查询
支持数据库的动态查询方法,例如:
// 根据name字段查询用户
$user = User::getByName('thinkphp');
// 根据email字段查询用户
$user = User::getByEmail('thinkphp@qq.com');
聚合查询
同样在模型中也可以调用数据库的聚合方法查询,例如:
User::count();
User::where('status','>',0)->count();
User::where('status',1)->avg('score');
User::max('score');
注意,如果你的字段不是数字类型,是使用max/min的时候,需要加上第二个参数。
User::max('name', false);
数据分批处理
模型也可以支持对返回的数据分批处理,这在处理大量数据的时候非常有用,例如:
User::chunk(100, function ($users) {
foreach($users as $user){
// 处理user模型对象
}
});
7343

被折叠的 条评论
为什么被折叠?



