模型的定义方式
定义模型
- 定义一个和数据库表向匹配的模型;
class User extends Model
- 模型会自动对应数据表,并且有一套自己的命名规则;
- 模型类需要去除表前缀
tp_
,采用驼峰式命名,并且首字母大写;
- tp_user(表名) => User
- tp_user_type(表名) => UserType
- 创建空模型后,我们可以在控制器调用;
- 可以直接使用模型的名称
User::\*
调用查询方法,比如select()
等; - 如果没有代码提示,请和上一节一样,把5.1的注释复制过来;
- 如果担心设置的模型类名和 PHP 关键字冲突,可以开启应用类后缀;
- 比如设置
Class UserModel
这种,需要更改文件名为UserModel.php
;
- 然后设置一下
$name
属性为指定user(表名)
即可实现;
设置模型
- 默认主键为
id
,你可以设置其它主键,比如uid
;
protected $pk = 'uid';
- 从控制器端调用模型操作,如果和控制器类名重复,可以设置别名;
use app\model\User as UserModel;
- 在模型定义中,可以设置其它的数据表;
protected $table = 'tp_one';
- 模型和控制器一样,也有初始化,在这里必须设置
static
静态方法;
//模型初始化
protected static function init()
{
//第一次实例化的时候执行 init
echo '初始化 User 模型';
}
模型的新增和删除
数据新增
- 使用实例化的方式添加一条数据,首先实例化方式如下,两种均可:
$user = new UserModel();
$user = new \app\model\User();
- 设置要新增的数据,然后用
save()
方法写入到数据库中,save()
返回布尔值;
$user->username = '李白';
$user->password = '123';
$user->gender = '男';
$user->email = 'libai@163.com';
$user->price = 100;
$user->details = '123';
$user->uid = 1011;
$user->save();
- 也可以通过
save()
传递数据数组的方式,来新增数据;
$user->save([
'username' => '李白',
'password' => '123',
'gender' => '男',
'email' => 'libai@163.com',
'price' => 100,
'details' => '123',
'uid' => 1011
]);
- 使用
allowField()
方法,允许要写入的字段,其它字段就无法写入了;
$user->allowField(['username','email', 'password','details'])->save();
- 模型新增也提供了
replace()
方法来实现REPLACE into
新增;
$user->replace()->save();
- 当新增成功后,使用
$user->id
,可以获得自增ID(主键需是id
);
echo $user->id;
- 使用
saveAll()
方法,可以批量新增数据,返回批量新增的数组;
$dataAll = [
[
'username' => '李白 1',
'password' => '123',
'gender' => '男',
'email' => 'libai@163.com',
'price' => 100,
'details' => '123',
'uid' => 1011
],
[
'username' => '李白 2',
'password' => '123',
'gender' => '男',
'email' => 'libai@163.com',
'price' => 100,
'details' => '123',
'uid' => 1011
]
];
$user = new UserModel();
dump($user->saveAll($dataAll));
- 使用::create()静态方法,来创建要新增的数据;
$user = UserModel::create([
'username' => '李白',
'password' => '123',
'gender' => '男',
'email' => 'libai@163.com',
'price' => 100,
'details' => '123',
'uid' => 1011
], ['username', 'password', 'details'], false);
//参数 1 是新增数据数组,必选
//参数 2 是允许写入的字段,可选
//参数 3 为是否 replace 写入,默认 false 为 Insert 写入
数据删除
- 使用
find()
方法,通过主键id
查询到想要删除的数据;
$user = UserModel::find(93);
- 然后再通过 delete()方法,将数据删除,返回布尔值;
$user->delete();
- 也可以使用静态方法调用
destroy()
方法,通过主键id
删除数据;
UserModel::destroy(92);
- 静态方法
destroy()
方法,也可以批量删除数据;
UserModel::destroy([80, 90, 91]);
- 通过数据库类的查询条件删除;
UserModel::where('id', '>', 80)->delete();
- 使用闭包的方式进行删除;
UserModel::destroy(function ($query) {
$query->where('id', '>', 80);
});
模型的数据更新
数据更新
- 使用
find()
方法获取数据,然后通过save()
方法保存修改,返回布尔值;
$user = UserModel::find(301);
$user->username = '李黑';
$user->email = 'lihei@163.com';
$user->save();
- 通过
where()
方法结合find()
方法的查询条件获取的数据,进行修改;
$user = UserModel::where('username', '李黑')->find();
$user->username = '李白';
$user->email = 'libai@163.com';
$user->save();
save()
方法只会更新变化的数据,如果提交的修改数据没有变化,则不更新;- 但如果你想强制更新数据,即使数据一样,那么可以使用
force()
方法;
$user->force()->save();
Db::raw()
执行SQL函数的方式,同样在这里有效;
$user->price = Db::raw('price+1');
- 使用
allowField()
方法,允许要更新的字段,其它字段就无法写入了;
$user->allowField(['username','email'])->save();
- 通过
saveAll()
方法,可以批量修改数据,返回被修改的数据集合;
$list = [
['id'=>118, 'username'=>'李白', 'email'=>'libai@163.com'],
['id'=>128, 'username'=>'李白', 'email'=>'libai@163.com'],
['id'=>129, 'username'=>'李白', 'email'=>'libai@163.com']
];
$user->saveAll($list);
- 批量更新
saveAll()
只能通过主键id
进行更新; - 使用静态方法
update()
更新,返回的是对象实例;
UserModel::update([
'id' => 118,
'username' => '李黑',
'email' => 'lihei@163.com'
]);
dump(UserModel::getLastsql());
UserModel::update([
'username' => '李黑',
'email' => 'lihei@163.com'
],['id'=>118]);
dump(UserModel::getLastsql());
UserModel::update([
'username' => '李黑',
'email' => 'lihei@163.com'
], ['id'=>118], ['username']); //只更新 username
UserModel::getLastsql();
- 模型的新增和修改都是
save()
进行执行的,它采用了自动识别体系来完成; - 实例化模型后调用
save()
方法表示新增,查询数据后调用save()
表示修改; - 当然,如果在
save()
传入更新修改条件后也表示修改;
模型的数据查询
数据查询
- 使用
find()
方法,通过主键id
查询到想要的数据;
$user = UserModel::find(129);
return json($user);
- 也可以使用
where()
方法进行条件筛选查询数据;
$user = UserModel::where('username', '辉夜')->find();
return json($user);
- 调用
find()
方法时,如果数据不存在则返回null
; - 同上,还有
findOrEmpty()
方法,数据不存在返回空模型; - 此时,可以后使用
isEmpty()
方法来判断,是否为空模型;
$user = UserModel::findOrEmpty(1111);
if ($user->isEmpty()) {
echo '空模型,无数据!';
}
- 使用
select([])
方式,查询多条指定id
的字段,不指定就是所有字段;
$user = UserModel::select([19,20,21]);
foreach ($user as $key=>$obj) {
echo $obj->username;
}
- 模型方法也可以使用
where
等连缀查询,和数据库查询方式一样;
$user = UserModel::where('status', 1)
->limit(5)
->order('id', 'desc')
->select();
- 获取某个字段
value()
或者某个列column()
的值;
UserModel::where('id', 79)->value('username');
UserModel::whereIn('id',[79,118,128])->column('username','id');
- 模型支持动态查询:
getBy\*
,\*
表示字段名;
UserModel::getByUsername('辉夜');
UserModel::getByEmail('huiye@163.com');
- 模型支持聚合查询:
max
,min
,sum
,count
,avg
等;
UserModel::max('price');
- 使用
chunk()
方法可以分批处理数据,数据库查询时讲过,防止一次性开销过大;
UserModel::chunk(5, function ($users) {
foreach($users as $user) {
echo $user->username;
}
echo '<br>------<br>';
});
- 可以利用游标查询功能,可以大幅度减少海量数据的内存开销,它利用了 PHP 生 成器特性。每次查询只读一行,然后再读取时,自动定位到下一行继续读取;
foreach (UserModel::where('status', 1)->cursor() as $user) {
echo $user->username;
echo '<br>------<br>';
}
最后一次更新于2020-07-29 14:07
0 条评论