模型的定义方式

定义模型

  1. 定义一个和数据库表向匹配的模型;
class User extends Model
  1. 模型会自动对应数据表,并且有一套自己的命名规则;
  2. 模型类需要去除表前缀tp_,采用驼峰式命名,并且首字母大写;
  • tp_user(表名) => User
  • tp_user_type(表名) => UserType
  1. 创建空模型后,我们可以在控制器调用;
  2. 可以直接使用模型的名称User::\*调用查询方法,比如select()等;
  3. 如果没有代码提示,请和上一节一样,把5.1的注释复制过来;

QQ截图20200724140250.png

  1. 如果担心设置的模型类名和 PHP 关键字冲突,可以开启应用类后缀;
  2. 比如设置Class UserModel这种,需要更改文件名为UserModel.php;

QQ截图20200724140349.png

  1. 然后设置一下$name属性为指定user(表名)即可实现;

QQ截图20200724140732.png

设置模型

  1. 默认主键为id,你可以设置其它主键,比如uid;
protected $pk = 'uid';

QQ截图20200724141010.png

  1. 从控制器端调用模型操作,如果和控制器类名重复,可以设置别名;
use app\model\User as UserModel;

QQ截图20200724141053.png

  1. 在模型定义中,可以设置其它的数据表;
protected $table = 'tp_one';

QQ截图20200724141149.png

  1. 模型和控制器一样,也有初始化,在这里必须设置static静态方法;
//模型初始化
protected static function init()
{
    //第一次实例化的时候执行 init
    echo '初始化 User 模型';
}

QQ截图20200724141326.png

模型的新增和删除

数据新增

  1. 使用实例化的方式添加一条数据,首先实例化方式如下,两种均可:
$user = new UserModel();
$user = new \app\model\User();

QQ截图20200724144000.png

  1. 设置要新增的数据,然后用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();

QQ截图20200724144519.png

  1. 也可以通过save()传递数据数组的方式,来新增数据;
$user->save([
'username' => '李白',
'password' => '123',
'gender' => '男',
'email' => 'libai@163.com',
'price' => 100,
'details' => '123',
'uid' => 1011
]);

QQ截图20200724144630.png

  1. 使用allowField()方法,允许要写入的字段,其它字段就无法写入了;
$user->allowField(['username','email', 'password','details'])->save();

QQ截图20200724144907.png

  1. 模型新增也提供了replace()方法来实现REPLACE into新增;
$user->replace()->save();

QQ截图20200724144946.png

  1. 当新增成功后,使用$user->id,可以获得自增ID(主键需是id);
echo $user->id;

QQ截图20200724145026.png

  1. 使用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));

QQ截图20200724145155.png

  1. 使用::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 写入

QQ截图20200724145353.png

数据删除

  1. 使用find()方法,通过主键id查询到想要删除的数据;
$user = UserModel::find(93);
  1. 然后再通过 delete()方法,将数据删除,返回布尔值;
$user->delete();

QQ截图20200724145720.png

  1. 也可以使用静态方法调用destroy()方法,通过主键id删除数据;
UserModel::destroy(92);

QQ截图20200724145821.png

  1. 静态方法destroy()方法,也可以批量删除数据;
UserModel::destroy([80, 90, 91]);
  1. 通过数据库类的查询条件删除;
UserModel::where('id', '>', 80)->delete();
  1. 使用闭包的方式进行删除;
UserModel::destroy(function ($query) {
    $query->where('id', '>', 80);
});

模型的数据更新

数据更新

  1. 使用find()方法获取数据,然后通过save()方法保存修改,返回布尔值;
$user = UserModel::find(301);
$user->username = '李黑';
$user->email = 'lihei@163.com';
$user->save();

QQ截图20200724161626.png

  1. 通过where()方法结合find()方法的查询条件获取的数据,进行修改;
$user = UserModel::where('username', '李黑')->find();
$user->username = '李白';
$user->email = 'libai@163.com';
$user->save();

QQ截图20200724161721.png

  1. save()方法只会更新变化的数据,如果提交的修改数据没有变化,则不更新;
  2. 但如果你想强制更新数据,即使数据一样,那么可以使用force()方法;
$user->force()->save();
  1. Db::raw()执行SQL函数的方式,同样在这里有效;
$user->price = Db::raw('price+1');

QQ截图20200724161957.png

  1. 使用allowField()方法,允许要更新的字段,其它字段就无法写入了;
$user->allowField(['username','email'])->save();
  1. 通过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);
  1. 批量更新saveAll()只能通过主键id进行更新;
  2. 使用静态方法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();

QQ截图20200724162315.png

  1. 模型的新增和修改都是save()进行执行的,它采用了自动识别体系来完成;
  2. 实例化模型后调用save()方法表示新增,查询数据后调用save()表示修改;
  3. 当然,如果在save()传入更新修改条件后也表示修改;

模型的数据查询

数据查询

  1. 使用find()方法,通过主键id查询到想要的数据;
$user = UserModel::find(129);
return json($user);

QQ截图20200724163945.png

  1. 也可以使用where()方法进行条件筛选查询数据;
$user = UserModel::where('username', '辉夜')->find();
return json($user);
  1. 调用find()方法时,如果数据不存在则返回null;
  2. 同上,还有findOrEmpty()方法,数据不存在返回空模型;
  3. 此时,可以后使用isEmpty()方法来判断,是否为空模型;
$user = UserModel::findOrEmpty(1111);
if ($user->isEmpty()) {
    echo '空模型,无数据!';
}
  1. 使用select([])方式,查询多条指定id的字段,不指定就是所有字段;
$user = UserModel::select([19,20,21]);
foreach ($user as $key=>$obj) {
    echo $obj->username;
}
  1. 模型方法也可以使用where等连缀查询,和数据库查询方式一样;
$user = UserModel::where('status', 1)
->limit(5)
->order('id', 'desc')
->select();
  1. 获取某个字段value()或者某个列column()的值;
UserModel::where('id', 79)->value('username');
UserModel::whereIn('id',[79,118,128])->column('username','id');
  1. 模型支持动态查询:getBy\*,\*表示字段名;
UserModel::getByUsername('辉夜');
UserModel::getByEmail('huiye@163.com');
  1. 模型支持聚合查询:max,min,sum,count,avg等;
UserModel::max('price');
  1. 使用chunk()方法可以分批处理数据,数据库查询时讲过,防止一次性开销过大;
UserModel::chunk(5, function ($users) {
    foreach($users as $user) {
        echo $user->username;
    }
    echo '<br>------<br>';
});
  1. 可以利用游标查询功能,可以大幅度减少海量数据的内存开销,它利用了 PHP 生 成器特性。每次查询只读一行,然后再读取时,自动定位到下一行继续读取;
foreach (UserModel::where('status', 1)->cursor() as $user) {
    echo $user->username;
    echo '<br>------<br>';
}