ThinkPHP5数据模型

1 获得模型

先定义模型 User

User::get(1);
//获得id=1的User

$user2=new User;
$user2::get(2);
//获得id=2的User

$user3=Loader::model("User");
$user3::get(3)
//获得id=3的User
//需要use think\Loader
//可以多个模型

$user4=model("User");
$user4::get(4)
//获得id=4的User
//助手函数,不需要use think\Loader

2 模型查询

$user=User::get(1);
$user=$user->toArray();
//获得id=1的User
//获得数据

$data=User::get(function($query){
        $query->where("id","eq",1);
})
$data=$data->toArray();
//获得数据

$data=User::where("id",10)
->field("id,name,age")
->find()
//链式操作

$data=User::all("1,2,3");
foreach($data as $val){
    dump($val->toArray());
}

3 模型添加

User::create([
'name'=>'smith',
'age'=>30,
'email'=>'smith@qq.com'
])

User::create([
'name'=>'smith',
'age'=>30,
'email'=>'smith@qq.com',
'book'=>'thinkphp'
],true)
//这里true可以防止插入不存在的book字段而报错

$user=new User;
$user->name='Joy';
$user->age=24;
$user->save();

$user=new User;
$user->save([
'name'=>'robot',
'age'=>22
])

$user=new User;
$user
->allowField(true)//过滤不存在的数据字段
->save([
'name'=>'robot',
'age'=>22,
'book'=>'c#'
])

$user=new User;
$user
->allowField(['name'])//只插入name字段值,并且过滤不存在的数据字段
->save([
'name'=>'robot',
'age'=>22,
'book'=>'c#'
])

同样还有
$user->saveAll($list)方法,插入多条数据,可以仅仅部分字段,返回每个model

4 更新数据

User::update([
'id'=>1,
'name'=>'Gog'
])
//更新ID=1的数据

User::update([
'id'=>1,
'name'=>'BOOB'
],['id'=>2])
//更新ID=2的数据

User::update([
'id'=>1,
'name'=>'Higo'
],function($query){
    $query->where("id","=",5)
})
//更新ID=5的数据

User::where("id","=",6)
->update([
'name'=>'Clop'
])
//返回更新的行数,如果同样的代码再次执行,返回0

$user->User::get(1);
$user->name='Tom';
$user->save();
//返回更新的行数,如果同样的代码再次执行,返回0

$user->new User;
$user->save([
'name'='Jack'
],['id]=>9])
//返回更新的行数,如果同样的代码再次执行,返回0

$user->new User;
$user->save([
'name'='Jack'
],function($query){
$query->where('id','<','10');
})
//更新<10的

$user->new User;
$user->saveAll([
    ['id'=>1,'name'=>'Pick''],
    ['id'=>2,'name'=>'Tomas']
]);
//更新多个,刷新同样执行

5 删除数据

User::destroy(1);
//返回删除的行数,如果同样的代码再次执行,返回0

User::destroy(['id'=>1]);
//效果一样

User::destroy(function($query){
    $query->where('id','<',5);
});
//删除<5的所有user

$user=User::get(6);
$user->delete();

User::where('id',8)
->delete();

6 聚合操作

User::count();
统计数量

User::where('id','>',5)->count();
//统计

max()//取得最大值

min()//最小值

sum()//求和

avg()//平均值

7 模型显示属性格式化

在model代码中:User.php,定义个性别获取器
public function getSexAttr($val){
    switch($val){
        case '1':
                     return '女';
                     break;
         case '2':
                     return '男';
                     break;
         default:
                    return '未设置';
                    break;
    }
}

设置后,模型中性别栏自动显示为 男 女 或 未设置

$data->User::get(1);
dump($data->toArray());
//这样输出的结果是格式化后的数据

如果希望还是显示数字0,1,2使用的是:
$data->User::get(1);
dump($data->getData());

8 模型修改器

在model代码中:User.php,定义个密码修改器

public function setPasswordAttr($val){
    return md5($val);
}

这样在插入操作的时候,不需要显示在代码中加密,它会自动修改;

特别的,如果这个方法有第二个参数。

/*
*  User类密码修改器
* @param $val 表示传入的密码值
* @param $data 表示传入的整个model
*/
public function setPasswordAttr($val,$data){
//    $data['age'] //得到年龄
}

9 模型自动完成

在model代码中:User.php,定义个auto数组,里面填上需要自动完成的字段;

protected $auto=['time'];

再定义一个set方法

public function setTimeAttr()
{
    return time();
}

protected $insert=[];//只在插入有效

protected $update=[];//只在更新有效

10 模型时间戳

在model代码中:User.php,有两个字段create_time和update_time

protected $autoWriteTimestamp=true;

当前模型的时间会自动填写。

如果字段名称不是这两个则需要在模型中声明,假设当前字段名为create_on和update_on

则需要补充代码如下

protected $createTime='create_on'; //这里填写的是字段名,如果是填写false,表示不开启
protected $updateTime='update_on';

这样就好了

11 软删除

在数据中添加字段delete_time,允许为null

①在模型中引入函数
use traits\model\SoftDelete;

②在模型体中
use SoftDelete;

③此时如果只选 User::destory(1),数据不直接删除,而是记录了deleteTime

④虽然数据不删除,如果使用User::get(1),返回的是Null

⑤如果需要获得软删除的数据需要User::withTrashed(true)->find(1);

⑥如果只想要软删除的数据User::onlyTrashed()->where();

同样如果字段名称不是delete_time,也是rotected $createTime='delete_on';的设置

如果设置了软删除,要真的删除

方法①
User::destory(1,true) //直接删除

方法②
$user=User::get(1);
$user->delete(true);

如果要去掉软删除标志,则update 删除字段的时间为null即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容