thinkphp5.0-模型
新版的模型进行了重构,更加对象化操作,包括关联模型的重构,主要特性包括:
- 完全对象式访问
- 支持静态调用(查询)
- 支持读取器/修改器
- 时间戳字段自动写入
- 对象/数组访问
- JSON序列化
- 模型事件触发
- 命名范围
- 类型自动转换
- 数据验证和自动完成
- 关联查询/操作
- 关联预载入
请不要以3.2版本的模型思维来使用5.0的模型,充分理解和掌握新版模 型的用法对于熟练掌握TP5有很大的帮助。
定义
版本 调整功能
5.0.5 model 或者 Loader::model 方法支持传入完整的模型类名
模型定义
定义一个User模型类:
namespace app\index\model;
use think\Model;
class User extends Model
{
}
默认主键为自动识别,如果需要指定,可以设置属性:
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $pk = 'uid';
}
模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,
并且首字母大写,例如:
模型名 约定对应数据表(假设数据库的前缀定义是 think_)
User think_user
UserType think_user_type
如果你的规则和上面的系统约定不符合,那么需要设置Model类的数据表名称属性,以确保
能够找到对应的数据表。
设置数据表
如果你想指定数据表甚至数据库连接的话,可以使用:
如果你的规则和上面的系统约定不符合,那么需要设置Model类的数据表名称属性,以确保
能够找到对应的数据表。
设置数据表
如果你想指定数据表甚至数据库连接的话,可以使用:
// 静态调用
$user = User::get(1);
$user->name = 'thinkphp';
$user->save();
// 实例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();
// 使用 Loader 类实例化(单例)
$user = Loader::model('User');
// 或者使用助手函数`model`
$user = model('User');
$user->name= 'thinkphp';
$user->save();
模型初始化
模型同样支持初始化,与控制器的初始化不同的是,模型的初始化是重写 Model 的
initialize ,具体如下
namespace app\index\model;
use think\Model;
class Index extends Model
{
//自定义初始化
protected function initialize()
{
//需要调用`Model`的`initialize`方法
parent::initialize();
//TODO:自定义的初始化
}
}
同样也可以使用静态 init 方法,需要注意的是 init 只在第一次实例化的时候执行,并且
方法内需要注意静态调用的规范,具体如下:
namespace app\index\model;
use think\Model;
class Index extends Model
{
//自定义初始化
protected static function init()
{
//TODO:自定义的初始化
}
}
新增
新增数据有多种方式。
添加一条数据
第一种是实例化模型对象后赋值并保存:
$user = new User;
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
也可以使用 data 方法批量赋值:
$user = new User;
$user->data([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
或者直接在实例化的时候传入数据
$user = new User([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
如果需要过滤非数据表字段的数据,可以使用:
$user = new User($_POST);
// 过滤post数组中的非数据表字段数据
$user->allowField(true)->save();
如果你通过外部提交赋值给模型,并且希望指定某些字段写入,可以使用:
$user = new User($_POST);
// post数组中只有name和email字段会写入
$user->allowField(['name','email'])->save();
save方法新增数据返回的是写入的记录数。
获取自增ID
如果要获取新增数据的自增ID,可以使用下面的方式:
$user = new User;