php增删改查模板,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.'
';

}

获取某个字段或者某个列的值

// 获取某个用户的积分(返回值:字符串)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值