thinkphp v5 模型的增删改查

模型定义

namespace app\index\model;

use think\Model;

class User extends Model
{
 protected $pk = 'uid';//默认主键是id,如果不是需要绑定
 protected $table = 'cms_user';//绑定数据表
// 设置当前模型的数据库连接(当你的数据库链接不是配置中链接时设置。)
    protected $connection = [
        // 数据库类型
        'type'        => 'mysql',
        // 服务器地址
        'hostname'    => '127.0.0.1',
        // 数据库名
        'database'    => 'thinkphp',
        // 数据库用户名
        'username'    => 'root',
        // 数据库密码
        'password'    => '',
        // 数据库编码默认采用utf8
        'charset'     => 'utf8',
        // 数据库表前缀
        'prefix'      => 'think_',
        // 数据库调试模式
        'debug'       => false,
    ];

}

模型调用

模型类可以使用静态调用或者实例化调用两种方式

  • 在模型中调用
// 静态调用
$user = User::get(1);//$user = $this->get(3);一样的效果,都是调用本类的方法
$user->name = 'thinkphp';
$user->save();

// 实例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();

// 使用 Loader 类实例化(单例)==>需要引入locader类,`use think\Loader;`
$user = Loader::model('User');

// 或者使用助手函数`model`也是单例
$user = model('User');
$user->name= 'thinkphp';
$user->id = 3;
$user->save();
  • 在控制器调用模型
//引入此model类
use app\index\model\User;//==》如果模型名和控制名一样的话需要设置别名。use app\index\model\User as UserModel;
//在方法中实例化
$user = new User;
//调用实例方法
$user->user_name= 'thinkphp';
return $user->save();
//当然也可以使用loader函数,只需在头部引入即可`use think\Loader;`

添加数据

  • 实例化模型对象后赋值并保存:
$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();

此种方式有个缺陷,就是字段值不能和Model里面的成员属性(比如class,具体看think\Model.php)一样,否则会赋值不上,版本5.0.10,已提出问题,不知道后期会不会优化。

  • 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();
  • 静态方法
    还可以直接静态调用create方法创建并写入:
$user = User::create([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID

获取自增ID

  • 出入数据获取自增id
$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();
// 获取自增ID
echo $user->id;//这里的id是主键,如果主键是user_id,那就是$user->user_id

注意不要在同一个实例里面多次新增数据,如果确实需要多次新增,因为当新增数据时,$user里面的字段值都是此条的数据,当你再次添加时,会造成当前数据部分值被替换,而且还存在主键。。。所以那不是新增数据,当然系统也会报错,那么可以用下面的方式:

$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();
$user->name     = 'onethink';
$user->email    = 'onethink@qq.com';
// 第二次开始必须使用下面的方式新增
$user->isUpdate(false)->save();
  • 添加多条数据
$user = new User;
$list = [
    ['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
    ['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);

saveAll方法新增数据返回的是包含新增模型(带自增ID)的数据集(数组)。

修改数据

修改数据和新增数据差不多一个道理,系统会根据数据或者条件自动识别是新增还是修改

  • 实例化模型后调用save方法表示新增;//存在主键会报错,当批量时可以设置saveAll的第二个参数为false
  • 查询数据后调用save方法表示更新;//因为查询后此实例带有主键值
  • save方法传入更新条件后表示更新;

批量更新仅能根据主键值进行更新,其它情况请使用foreach遍历更新。

删除当前模型

  • delete
    delete方法需要查询再删除,如果不查询想通过主键删除的话需要添加where条件,否则会报‘添加条件’错误
$user = User::get(1);
$user->delete();
//或者
$user->where('id',1)->delete();
  • destroy
    destroy不能使用其他连贯操作,如果使用的话会报method not exist:think\db\Query->destroy错误,具体请看destroy和delete函数的区别。但是可以在传递参数时设置条件,同时也支持闭包
User::destroy(1);
// 支持批量删除多个数据
User::destroy('1,2,3');
// 或者
User::destroy([1,2,3]);
//条件:id>:id
User::destroy(['id'=>['>',$id]]);
//闭包
User::destroy(function($query) use($id){
     $query->where('id','>',$id);
});

V5.0.9+版本开始当destroy方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的

查询

  • 获取单个数据 get
取出主键为1的数据
$user = User::get(1);
echo $user->name;

// 使用数组查询
$user = User::get(['name' => 'thinkphp']);

// 使用闭包查询
$user = User::get(function($query){
    $query->where('name', 'thinkphp');
});
echo $user->name;

/在模型中,User::可以$this->;如User::get(1)和$this->get(1)一样
get方法也是不能使用连贯操作的,而且需要传递参数
如果你是在模型内部,请不要使用$this->name的方式来获取数据,请使用$this->getAttr('name') 替代。因为可能会和model类的成员属性重复。

  • 查询单个 find
$user = new User();
// 查询单个数据
$user->where('name', 'thinkphp')
    ->find();
  • 获取多个数据 all
// 根据主键获取多个数据
$list = User::all('1,2,3');
// 或者使用数组
$list = User::all([1,2,3]);
foreach($list as $key=>$user){
    echo $user->name;
}
// 使用数组查询
$list = User::all(['status'=>1]);
// 使用闭包查询
$list = User::all(function($query){
    $query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
    echo $user->name;
}

数组方式和闭包方式的数据查询的区别在于,数组方式只能定义查询条件,闭包方式可以支持更多的连贯操作,包括排序、数量限制等。

  • 获取多个数据 select
$user = new User();
// 查询数据集
$user->where('name', 'thinkphp')
    ->limit(10)
    ->order('id', 'desc')
    ->select();

虽然说返回的结果集是一个数组对象,但是不影响遍历(也不影响在模板中遍历),直接像处理3.2一样处理
$list = User::all(function($query){
$query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
echo $user['id'].':'.$user->name.'<br />';
}

  • 获取某个字段或者某个列的值
// 获取某个用户的积分(返回值:字符串)
User::where('id',10)->value('score');
// 获取某个列的所有值(返回值:数组)
User::where('status',1)->column('name');
// 以id为索引)(返回值:数组)
User::where('status',1)->column('name','id');
User::where('status',1)->column('id,name'); // 同tp3的getField

动态查询

// 根据name字段查询用户
$user = User::getByUserName('new1');//
// 根据email字段查询用户
$user = User::getByEmail('thinkphp@qq.com');

默认按照数据表从上到下的顺序查询第一条复合的数据,如果需要排序则添加连贯操作

数据分批处理

处理大量数据的时候使用

User::chunk(100,function($users){
    foreach($users as $user){
        // 处理user模型对象
    }
});

查询缓存

get方法和all方法的第三个参数表示是否使用查询缓存,或者设置缓存标识。

$user = User::get(1,'',true);
$list  = User::all('1,2,3','',true);

由于第二个参数是关联预载入定义,V5.0.6+版本开始,可以直接在第二个参数传入true表示开启查询缓存。

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

推荐阅读更多精彩内容