模型的定义方式
定义模型
- 定义一个和数据库表向匹配的模型;
 
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         
 
        
Alipay
Wechat
           
           
   
  
0 条评论