6.thinkphp的增删改查

新增:

静态方法

还可以直接静态调用create方法创建并写入:

$user = User::create([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID

save方法不同的是,create方法返回的是当前模型的对象实例。

create方法默认会过滤不是数据表的字段信息,可以在第二个参数可以传入允许写入的字段列表,例如:

// 只允许写入name和email字段的数据
$user = User::create([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
], ['name', 'email']);
echo $user->name;
echo $user->email;
echo $user->id; // 获取自增ID

支持replace操作,使用下面的方法:

$user = User::create([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
], ['name','email'], true);

新增数据的最佳实践原则:使用create方法新增数据,使用saveAll批量新增数据。

更新:

查找并更新

在取出数据后,更改字段内容后使用save方法更新数据。这种方式是最佳的更新方式

$user = User::find(1);
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();

save方法成功返回true,并只有当before_update事件返回false的时候返回false,有错误则会抛出异常。

对于复杂的查询条件,也可以使用查询构造器来查询数据并更新

$user = User::where('status',1)
	->where('name','liuchen')
	->find();
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();

save方法更新数据,只会更新变化的数据,对于没有变化的数据是不会进行重新更新的。如果你需要强制更新数据,可以使用下面的方法:

$user = User::find(1);
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->force()->save();

这样无论你的修改后的数据是否和之前一样都会强制更新该字段的值。

如果要执行SQL函数更新,可以使用下面的方法

$user = User::find(1);
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->score	=  Db::raw('score+1');
$user->save();

删除

删除当前模型

删除模型数据,可以在查询后调用delete方法。

$user = User::find(1);
$user->delete();

delete方法返回布尔值

根据主键删除

或者直接调用静态方法(根据主键删除)

User::destroy(1);
// 支持批量删除多个数据
User::destroy([1,2,3]);

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

条件删除

还支持使用闭包删除,例如:

User::destroy(function($query){
    $query->where('id','>',10);
});

或者通过数据库类的查询条件删除

User::where('id','>',10)->delete();

直接调用数据库的delete方法的话无法调用模型事件。

最佳实践

删除的最佳实践原则是:如果删除当前模型数据,用delete方法,如果需要直接删除数据,使用destroy静态方法。

查询

获取单个数据

1.使用find()方法,通过主键(id)查询到想要的数据;

$user = UserModel::find(129);

returnjson($user)

2.也可以使用where()方法进行条件筛选查询数据;

$user = UserModel::where('username','辉夜')->find();
 returnjson($user);

3.调用find()方法时,如果数据不存在则返回Null;

4.同上,还有findOrEmpty()方法,数据不存在返回空模型;

5.此时,可以后使用isEmpty()方法来判断,是否为空模型;

$user = UserModel::findOrEmpty(1111);
 if($user->isEmpty()) {
 echo '空模型,无数据!';
 }

6.使用select([])方式,查询多条指定id的字段,不指定就是所有字段;

$user = UserModel::select([19,20,21]);
 foreach ($user as $key=>$obj){
 echo $obj->username;
 }

7.模型方法也可以使用where等连缀查询,和数据库查询方式一样;

$user = UserModel::where('status', 1)->limit(5)->order('id', 'desc')->select();

8.获取某个字段value()或者某个列column()的值;

UserModel::where('id',79)->value('username');
 UserModel::whereIn('id',[79,118,128])->column('username','id');

9.模型支持动态查询:getBy*,*表示字段名;

UserModel::getByUsername('辉夜');
UserModel::getByEmail('huiye@163.com');

10. 模型支持聚合查询:max、min、sum、count、avg等;

UserModel::max('price');

11. 使用chunk()方法可以分批处理数据,数据库查询时讲过,防止一次性开销过大;

UserModel::chunk(5, function ($users) {
 foreach($users as $user) {
 echo $user->username;
 }
 echo '<br>------<br>';
 });

12. 可以利用游标查询功能,可以大幅度减少海量数据的内存开销,它利用了PHP 生 成器特性。每次查询只读一行,然后再读取时,自动定位到下一行继续读取;

foreach (UserModel::where('status', 1)->cursor() as $user) {
 echo $user->username;
 echo '<br>------<br>';
 }

-------------------------------------------------------------------------------------------------------------------

获取单个数据的方法包括:

// 取出主键为1的数据
$user = User::find(1);
echo $user->name;

// 使用查询构造器查询满足条件的数据
$user = User::where('name', 'thinkphp')->find();
echo $user->name;

模型使用find方法查询,如果数据不存在返回Null,否则返回当前模型的对象实例。如果希望查询数据不存在则返回一个空模型,可以使用。

$user = User::findOrEmpty(1);

你可以用isEmpty方法来判断当前是否为一个空模型。

$user = User::where('name', 'thinkphp')->findOrEmpty();
if (!$user->isEmpty()) {
    echo $user->name;
}

$user = User::where('name', 'thinkphp')->findOrEmpty(); if (!$user->isEmpty()) { echo $user->name; }

获取多个数据

取出多个数据:

// 根据主键获取多个数据
$list = User::select([1,2,3]);
// 对数据集进行遍历操作
foreach($list as $key=>$user){
    echo $user->name;
}

要更多的查询支持,一样可以使用查询构造器:

// 使用查询构造器查询
$list = User::where('status', 1)->limit(3)->order('id', 'asc')->select();
foreach($list as $key=>$user){
    echo $user->name;
}

查询构造器方式的查询可以支持更多的连贯操作,包括排序、数量限制等。

使用查询构造器

在模型中仍然可以调用数据库的链式操作和查询方法,可以充分利用数据库的查询构造器的优势。

例如:

User::where('id',10)->find();
User::where('status',1)->order('id desc')->select();
User::where('status',1)->limit(10)->select();

User::where('id',10)->find(); User::where('status',1)->order('id desc')->select(); User::where('status',1)->limit(10)->select();

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

// 获取某个用户的积分
User::where('id',10)->value('score');
// 获取某个列的所有值
User::where('status',1)->column('name');
// 以id为索引
User::where('status',1)->column('name','id');

valuecolumn方法返回的不再是一个模型对象实例,而是纯粹的值或者某个列的数组。

动态查询

支持数据库的动态查询方法,例如:

// 根据name字段查询用户
$user = User::getByName('thinkphp');

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

聚合查询

同样在模型中也可以调用数据库的聚合方法查询,例如:

User::count();
User::where('status','>',0)->count();
User::where('status',1)->avg('score');
User::max('score');

注意,如果你的字段不是数字类型,是使用max/min的时候,需要加上第二个参数。

User::max('name', false);

数据分批处理

模型也可以支持对返回的数据分批处理,这在处理大量数据的时候非常有用,例如:

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值