美文网首页
thinkphp v5 模型的增删改查

thinkphp v5 模型的增删改查

作者: 呦丶耍脾气 | 来源:发表于2017-09-22 19:11 被阅读307次

模型定义

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表示开启查询缓存。

相关文章

  • thinkphp v5 模型的增删改查

    模型定义 模型调用 模型类可以使用静态调用或者实例化调用两种方式 在模型中调用 在控制器调用模型 添加数据 实例化...

  • 今晚一个晚上的Thinkphp学习总结

    首先,Thinkphp的MVC模型中的Model还真是传说中的数据层,在正常的增删改查操作下,Model其实真的只...

  • thinkphp5.0 模型增删改查

    一、使用模型前准备工作 如果查询的表中有create_time时间字段,需要配置database.php,否则报格...

  • mysql的插入语句

    MySQL增删改查之增insert、replace

  • MYSQL数据库的增删改查

    MYSQL数据库的增删改查 一.对于库的增删改查 增create database 库名称;create data...

  • 关于python的list的增查删改

    说到增查删改,想起了数据库,我们在关系型数据库当中就会对表进行增查删改。 在python当中我们也可以对list进...

  • 0812 A

    mongodb 增删改查 增: db.createCollection("name", {options:numb...

  • 增删改

    对于表中的操作,就是增删改查,查内容较多,这里先说增删改。 1.增(insert或者load) 即插入数据,多行插...

  • thinkphp v5 数据库操作增删改查篇

    尽量不要使用助手函数,助手函数每次调用都会实例化,DB调用属于单例操作。 1 链接数据库 1.1 方式一 :配置文...

  • SQL查询结构总结

    SQL 增删改查 对数据库有修改的操作是:增删改 增 insert into 表名 values(); 删 del...

网友评论

      本文标题:thinkphp v5 模型的增删改查

      本文链接:https://www.haomeiwen.com/subject/ivaxextx.html