Hyperf 之数据库
在模型的动态方法中获取多条数据(二维数组)
$withdraw = $this::query()->where('uid', $userId)
->whereIn('status', [1, 3, 5])
->whereBetween('withdraw_time', [$beginThismonth, $endThismonth])
->get()->toArray();
这样返回的是数组可以直接数组调用
获取单条对象数据
这样获取到的数据是对象的形式,需要以对象的形式调用
$userInfo = UserInfo::query()->where('uid',$userId)->first();
转换成数组形式 $userInfo=json_decode(json_encode($userInfo),true);
更新模型
$tudi_invite_record=InviteRecord::query()->where([
['uid','=', $tudi_uid],
['fromUid','=', $user->uid]
])->first();
$tudi_invite_record->name = 'Hi Hyperf';
$tudi_invite_record->save();
//或者
$tudi_invite_record=InviteRecord::query()->where([
['uid','=', $tudi_uid],
['fromUid','=', $user->uid]
])->find(1);
$tudi_invite_record->name = 'Hi Hyperf';
$tudi_invite_record->save();
//批量更新
User::query()->where('gender', 1)->update(['gender_show' => '男性']);
//插入
use App\Model\User;
/** @var User $user */
$user = new User();
$user->name = 'Hyperf';
$user->save();
更新或者新增
有时您可能希望更新数据库中的现有记录,或者如果不存在匹配记录则创建它。 在这种情况下,可以使用 updateOrInsert 方法。 updateOrInsert 方法接受两个参数:一个用于查找记录的条件数组,以及一个包含要更改记录的键值对数组。
updateOrInsert 方法将首先尝试使用第一个参数的键和值对来查找匹配的数据库记录。 如果记录存在,则使用第二个参数中的值去更新记录。 如果找不到记录,将插入一个新记录,更新的数据是两个数组的集合:
Db::table('users')->updateOrInsert(
['email' => 'john@example.com', 'name' => 'John'],
['votes' => '2']
);
其他创建方法
firstOrCreate / firstOrNew
这里有两个你可能用来批量赋值的方法: firstOrCreate 和 firstOrNew。
firstOrCreate 方法会通过给定的 列 / 值 来匹配数据库中的数据。如果在数据库中找不到对应的模型, 则会从第一个参数的属性乃至第二个参数的属性中创建一条记录插入到数据库。
firstOrNew 方法像 firstOrCreate 方法一样尝试通过给定的属性查找数据库中的记录。不同的是,如果 firstOrNew 方法找不到对应的模型,会返回一个新的模型实例。注意 firstOrNew 返回的模型实例尚未保存到数据库中,你需要手动调用 save 方法来保存:
<?php
use App\Model\User;
// 通过 name 来查找用户,不存在则创建...
$user = User::firstOrCreate(['name' => 'Hyperf']);
// 通过 name 查找用户,不存在则使用 name 和 gender, age 属性创建...
$user = User::firstOrCreate(
['name' => 'Hyperf'],
['gender' => 1, 'age' => 20]
);
// 通过 name 查找用户,不存在则创建一个实例...
$user = User::firstOrNew(['name' => 'Hyperf']);
// 通过 name 查找用户,不存在则使用 name 和 gender, age 属性创建一个实例...
$user = User::firstOrNew(
['name' => 'Hyperf'],
['gender' => 1, 'age' => 20]
);
删除模型
可以在模型实例上调用 delete 方法来删除实例:
use App\Model\User;
$user = User::query()->find(1);
$user->delete();
通过查询删除模型
您可通过在查询上调用 delete 方法来删除模型数据,在这个例子中,我们将删除所有 gender 为 1 的用户。与批量更新一样,批量删除不会为删除的模型启动任何模型事件:
use App\Model\User;
// 注意使用 delete 方法时必须建立在某些查询条件基础之上才能安全删除数据,不存在 where 条件,会导致删除整个数据表
User::query()->where('gender', 1)->delete();
通过主键直接删除数据
在上面的例子中,在调用 delete 之前需要先去数据库中查找对应的模型。事实上,如果你知道了模型的主键,您可以直接通过 destroy 静态方法来删除模型数据,而不用先去数据库中查找。 destroy 方法除了接受单个主键作为参数之外,还接受多个主键,或者使用数组,集合来保存多个主键:
use App\Model\User;
User::destroy(1);
User::destroy([1,2,3]);
软删除
除了真实删除数据库记录,Hyperf 也可以「软删除」模型。软删除的模型并不是真的从数据库中删除了。事实上,是在模型上设置了 deleted_at 属性并将其值写入数据库。如果 deleted_at 值非空,代表这个模型已被软删除。如果要开启模型软删除功能,你需要在模型上使用 Hyperf\Database\Model\SoftDeletes trait
SoftDeletestrait 会自动将deleted_at属性转换成DateTime / Carbon实例
<?php
namespace App\Model;
use Hyperf\Database\Model\Model;
use Hyperf\Database\Model\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}