thinkphp v5 模型的增删改查

2017-09-22  本文已影响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,已提出问题,不知道后期会不会优化。

$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();
$user = User::create([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
echo $user->name;
echo $user->email;
echo $user->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)的数据集(数组)。

修改数据

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

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

删除当前模型

$user = User::get(1);
$user->delete();
//或者
$user->where('id',1)->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则是有效的

查询

取出主键为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类的成员属性重复。

$user = new User();
// 查询单个数据
$user->where('name', 'thinkphp')
    ->find();
// 根据主键获取多个数据
$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;
}

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

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

上一篇 下一篇

猜你喜欢

热点阅读