ThinkPHP5数据库助⼿函数模型(model)的使⽤
在使⽤ThinkPHP5的过程中,我经常使⽤db进⾏数据库操作的,后来接触到了模型(model),刚使⽤时感觉跟db没啥区别,后来查官⽹知道模型基类中还提供了较多的其他的⽅法可以⽅便使⽤例如获取器、修改器、数据完成等等功能。因此模型的功能更为强⼤,tp5官⽹推荐使⽤model。
就数据格式⽽⾔,在DB中是采⽤的数组格式使⽤。⽽在模型中统⼀使⽤对象。其中数据库交互后涉及到格式转换。因此在同等情况下db的数据略快与模型⽅式。因此对于ThinkPHP5使⽤DB与model的⽅式具体在编程中选择哪⼀个按照个⼈的观点并⽆强制要求。有时候为了项⽬中的封装采⽤模型⽅式可能更为合适⼀些
1、模型定义
在model定义⼀个Blog模型类:
<?php
namespace app\demo\model;
use think\Model;
class Blog extends Model
{
//默认主键为⾃动识别,如果需要指定,可以设置属性:
//protected $pk = 'uid';
}
模型会⾃动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采⽤驼峰法命名,并且⾸字母⼤写,例如:
模型名约定对应数据表(假设数据库的前缀定义是 think_)
User think_user
UserType think_user_type
假设我这个类名和表名不相⼲的,但我这个类想操作这个表,tp5还有另⼀种⽅法:
<?php
namespace app\demo\model;
use think\Model;
class Test extends Model
{
//设置数据表(不含前缀)
protected $name = 'blog';
//设置完整的数据表
// protected $table = 'tp_codes';
}
2、模型调⽤
模型类可以使⽤静态调⽤或者实例化调⽤两种⽅式,例如:
//静态调⽤
$blog = Blog::get(1);//以id为1作为条件(⾃动根据主键来查)
// 实例化模型
$blog = new Blog();
// 使⽤ Loader 类实例化(单例)
$blog = Loader::model('Blog');
// 或者使⽤助⼿函数`model`
$blog = model('Blog');
3、使⽤模型增删查改
(1)模型查询操作
//查询
$blog = Blog::get(2);//以id为1作为条件(⾃动根据主键来查)
echo $blog->title;//输出:php实战
$user = new User();
// 查询单个数据
$user->where('name', 'thinkphp')
->find();
//多条件查询,可以传⼊数组作为查询条件
$bolg = Blog::get(['title'=>'模型1','content'=>'模型内容2']);
$bolg = Blog::where(['title'=>'模型1','content'=>'模型内容2'])->find();
echo $bolg->id;
//查询全部
$bolg = Blog::all();
foreach($bolg as $key=>$v){
echo $v->title."<br>";
}
$user = new User();
// 查询数据集
$user->where('name', 'thinkphp')
->limit(10)
->order('id', 'desc')
->select();
动态查询:通过getByxxx()进⾏条件查询,后⾯的xxx是字段名称(按驼峰命名)
/
/根据某个条件查询数据 getByxxx() ⽅法
$bolg = Blog::getByTitle('模型1');
echo $bolg->content;
(2)模型添加操作
$blog = new Blog()
//添加单条
$blog->title = '模型';
$blog->author = 'lhs';
$blog->publish_time = '11';
$blog->content = '模型内容';
$blog->save();
/
/批量新增
$list = [
['title'=>'模型1','author'=>'lhs','publish_time'=>'12','content'=>'模型内容2'], ['title'=>'模型2','author'=>'lhs','publish_time'=>'13','content'=>'模型内容3'] ];
if($blog->saveAll($list)){
echo '⽤户添加成功!';
}
或者使⽤isUpdate进⾏添加操作
//⽤这个⽅法添加数据
$blog = Blog::get(1);
$blog->title = 'get添加模型';
$blog->author = 'lhs';
$blog->publish_time = '1568908800';
$blog->content = '模型内容';
$blog->id = null;
if($blog->isUpdate(false)->save()){
echo "添加成功!";
}
注:要把id设置为空,不然报主键重复的错误
(3)模型更新操作
//更新
$blog = new Blog();
$blog->id = 24;
$blog->title = '更新模型';
$blog->author = 'lhs';
$blog->publish_time = '1572919302';
$blog->content = '模型内容';
$blog->isUpdate()->save();
//调⽤这个⽅法,isUpdate改true(即默认是更新操作)
$blog = Blog::get(1);
$blog->title = '更新模型';
$blog->author = 'lhs';
$blog->publish_time = '1553011200';
$blog->content = '模型内容';
if($blog->save()){
echo "更新成功!";
}
(4)模型删除操作
$bolg = Blog::get(25);
$bolg->delete();
Blog::destroy(26);
4、读取器和修改器
读取器的作⽤是在获取数据的字段值后⾃动进⾏处理,修改器的作⽤是可以在数据赋值的时候⾃动进⾏转换处理,例如:
<?php
namespace app\demo\model;
use think\Model;
class Codes extends Model
{
//读取器
public function getPublishTimeAttr($value)
{
return date("Y-m-d H:i",$value);
}
//$data为获取整个对象
public function getNameAttr($value,$data)
{
return '书名:'.$data['name'].',价格:'.$data['price'];
}
//修改器
public function setPublishTimeAttr($value)
{
return strtotime($value);
}
}
使⽤读取器和修改器
public function read(){
//读取器的⽅法命名规范:get+属性名(驼峰命名法)+Attr
/
*$code = Codes::get(1);
echo $code->publish_time; //如果⾃定义了getXXXAttr就调⽤,没有⾃定义就原样输出
echo $code->name;*/
//添加
$code = new Codes();
$code->name = '⽀付宝基⾦';
$code->category = '经济';
$code->price = '161';
$code->publish_time = '2019-9-27';//调⽤setPublishTimeAttr⽅法,在添加是⾃动转为时间戳
$code->save();
}
5、类型转换
integer:设置为integer(整型)后,该字段写⼊和输出的时候都会⾃动转换为整型。
float:该字段的值写⼊和输出的时候⾃动转换为浮点型。
boolean:该字段的值写⼊和输出的时候⾃动转换为布尔型。
array:如果设置为强制转换为array类型,系统会⾃动把数组编码为json格式字符串写⼊数据库,取出来的时候会⾃动解码。
object:该字段的值在写⼊的时候会⾃动编码为json字符串,输出的时候会⾃动转换为stdclass对象。
serialize:指定为序列化类型的话,数据会⾃动序列化写⼊,并且在读取的时候⾃动反序列化。
json:指定为json类型的话,数据会⾃动json_encode写⼊,并且在读取的时候⾃动json_decode处理。
timestamp:指定为时间戳字段类型的话,该字段的值在写⼊时候会⾃动使⽤strtotime⽣成对应的时间戳,输出的时候会⾃动转换
为dateFormat属性定义的时间字符串格式,默认的格式为Y-m-d H:i:s
例⼦:
//类型转换
protected $type = [
'publish_time' => 'timestamp:Y-m-d',
'name' => 'serialize'//序列化
];
在修改数据时⾃动转换类型
//⾃动转换,修改
$code = new Codes();
$code->name = ['中国的经济','⾦融危机','美国的经济霸权'];
php修改数据库内容$code->category = '经济';
$code->price = '132161';
$code->publish_time = '2019-12-27';//调⽤setPublishTimeAttr⽅法,在添加是⾃动转为时间戳
$code->save();
6、⾃动完成
数据⾃动完成指在不需要⼿动赋值的情况下对字段的值进⾏处理后写⼊数据库。
系统⽀持auto、insert和update三个属性,可以分别在写⼊、新增和更新的时候进⾏字段的⾃动完成机制,auto属性⾃动完成包含新增和更新操作,例如:
//⾃动完成,更新
protected $update = [ 'category' => '经济' ];
//⾃动完成,新增
protected $insert = [ 'category' => '经济' ];
//⾃动完成对category更新和添加
//⾃动完成,更新
$code = Codes::get(4);
$code->name = '⽀付宝的霸权';
$code->save();
//⾃动完成,新增
$code = new Codes();
$code->name = '中国经济霸权';
$code->price = '270000';
$code->publish_time = '2019-12-27';
$code->save();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论