美文网首页
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 模型的增删改查

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