快速上手Laravel6 Eloquent ORM 增删改查
关于 Eloquent ORM 的介绍不叙述,详情请查看官方文档。这里以实操为主。最简单最直白的方式快速上手模型操作数据库。但有一点不得不说,要得心顺手的使用 Laravel,就必须遵循它的规则,Laravel 遵循【约定优于配置】。
关于【约定优于配置】,如模型类所映射的表明名、主键、关联关系、日期格式等都是系统已经约定好的配置。因此,可以不用额外的配置就可以顺利使用它得到自己想要的结果。
通过下面的属性,可以改变约定的配置,只需要在模型中重写下面的属性即可。
表名
protected $primaryKey = ‘my_user’;
Ps:指定模型对应的数据表。Eloquent 默认每张表后都会有 s
,如 users
。若我们的表没有 s
或是其他名字,那么就要通过该属性进行指定。
主键
protected $primaryKey = ‘user_id’;
Ps:Laravel 默认数据库主键为 id,通过重写该属性,可改变为自己所设置的主键 id
public $incrementing = false;
Ps:若主键不是自增,将其设置 fasle
protected $keyType = 'string';
Ps:若主键不是整型,将其设置为 string
时间戳
protected $timestamps = false;
Ps:Eloquent 默认约定每张表都有 created_at 和 updated_at 字段,且保存模型时自动维护这两个字段。这个两个字段有一个存在,有一个不存在,那么必须将该属性设置为 false
时间格式
protected $dateFormat = ‘U’;
Ps:默认时间存储格式为 Y-m-d H:i:s,需要时间设置 unix 时间戳,则将属性重写为 U
6.1、Eloquent查询
条件:引入模型类,如 use App\User;
获取所有数据 返回值:存在返回模型类集合 , 不存在返回null
$users = User::all();
$users = User::get();
获取一条数据 返回值:存在返回模型类实例 , 不存在返回 null
$user = User::find(1);
$user = User::where(‘id’,’>’,10)->first();
获取一条数据(推荐)返回值:存在返回模型类实例 , 不存在返回 404页面
$user = User::findOrFail(1);
$user = User::where(‘id’,’>’,10)->firstOrFail();
6.2、Eloquent插入
单条数据插入 返回值:成功返回 true
$user = new User;
$user->name = '新加的名字';
$user->email = '新加的邮箱';
$user->nickname = '新加的昵称';
$user->password = bcrypt(123456);
$user->save();
Ps:关于使用模型来添加数据,可以这样理解,把接收过的数据赋值为模型类的字段属性,然后通过save()方法进行保存。
批量数据插入 返回值:成功返回模型实例
注意点:想要使用批量插入,就必须在模型中设置黑名单 ($fillable) 或白名单 ($guarded)
白名单:允许添加的字段。如 name,nickname。意思是只允许这个两个字段的数据插入。
黑名单:不允许添加的字段。如 name。意思是除了name字段外,其他字段数据都可插入。
用法:两个属性设置一个属性即可。
如:
protected $guarded = []; // 允许所有字段插入数据库
protected $fillable = ['name']; // 只允许name插入数据库
批量插入具体案例:
App\User.php 模型中设置黑名单
protected $guarded = [];
打开 App\Http\Controller\UserController.php 文件
$user = User::create([
'name'=>'wangwu1',
'nickname'=>'2314',
'email'=>'wang1wu@qq.com',
'password'=>bcrypt(123456)
]);
6.3、Eloquent更新
单条数据更新 返回值:成功返回 true
$user = User::find(4);
$user->name = '我是更新后的名字';
$user->save();
Ps:要更新数据就必须先获取到要更新的数据,然后为其属性赋上要更新的数据,然后更新。
批量数据更新 返回值:成功返回受影响的行数,失败返回 0
$user = User::where('id',41)->update([
'name'=>'批量更新后的名字',
'nickname'=>'批量更新后的昵称'
]);
Ps:1)批量更新,数据必须是一个键值对数组;2)通过Eloquent批量更新时,saved与updated模型事件不会在更新时触发,原因是批量更新没有从数据库获取模型。
6.4、Eloquent删除
方法一:模型删除 返回值:成功返回受影响的行数,
$user = User::find(7);
$user->delete();
方法二:destroy删除 返回值:成功返回受影响的行数,失败返回 0
注意:destroy可以删除一条数据,也可以删除多条数据,删除多条数据,则传入数组。
\App\Goods::destroy(26);
\App\Goods::destroy([25,24]);
方法三:通过查询删除 返回值:成功返回受影响的行数,失败返回 0
\App\Goods::where('id',23)->delete();
Ps:注意:通过 Eloquent 批量删除时,deleting 与 deleted 模型事件不会被触发。
6.5、其他方法
除了了上面的操作方法之外,还有几种其他操作方法,下面列表出来,但不会进行实际演示。关于用法,请参考官方文档。
firstOrCreate() firstOrNew() updateOrCreate()
6.6、软删除
上述的所有删除操作,都在数据库中删除了实际的数据,很难找回。Eloquent 提供了软删除。软删除本质就是修改字段属性值从而实现删除。用户删除了数据,实际上是对用户隐藏了此条数据的显示,而数据库中依然存在这条数据,只不过不再对用户显示罢了。
Laravel 中通过 deleted_at 字段来实现对数据的软删除。
使用软删除的必要条件:
1) 在相对应的模型文件中引入 use Illuminate\Database\Eloquent\SoftDeletes
2)在模型文件中使用 trait。 use SoftDeletes;
3)创建迁移文件,添加软删除所需要的 deleted_at 字段,默认为 NULL
$ php artisan make:migration alter_goods_add_deleted_at --table=goods
4)编写迁移文件,添加字段
Schema::table('goods', function (Blueprint $table) {
$table->softDeletes();
});
5)执行迁移文件
$ php artisan migrate
软删除字段添加完成。
Ps:由于在开始编写迁移文件时没有涉及到软删除,因此后面使用时采用了添加字段迁移文件的方法。最佳用法,建议在设计数据库字段时考虑好删除的问题。
6.6.1、软删除的四种方法
1)使用delete删除模型
$goods = Goods::find(16);
if($goods->delete()){
return '删除商品成功';
}else{
return '删除商品失败';
}
Ps:使用 delete 删除模型必须先要获取删除的模型实例,然后调用 delete() 方法进行软删除。
2)使用 destroy() 删除模型 返回值:被删除的记录数
$goods = Goods::destroy(15); // 软删除单个
$goods = Goods::destroy([1,2]); // 软删除多个
Ps:使用 destroy 删除模型删除多条数据时,参数可以是数组,也可以不是数组。如 destroy([1,2]) 与 destroy(1,2) 效果是一样的。
3)使用查询构建器删除模型 返回值:被删除的记录数
$goods = Goods::where(‘id’,3)->delete();
Ps:删除这三种方式,若没有引入软删除,则会在数据表中真实的删除数据。根据文档所介绍,要在模型中添加$data 属性 (protected $dates = ['delete_at'];),我没有在模型中添加此属性,而且使用传统的删除模式都实现了软删除。暂时不解其因,有待深究。下面来看看文档中实现软删除的方法。
4)trashed软删除
$goods = Goods::find(10);
$goods->delete();
if($goods->trashed()){
return '软删除成功';
}
永久删除 返回值:成功返回 true
$goods = \App\Goods::find(2);
$goods->forceDelete();
Ps:软删除中的永久删除与普通的删除无差异,都是将数据从数据表中删除。
6.6.2、查询软删除数据
查询单个
$goods = Goods::withTrashed()->find(10);
查询所有软删除数据
$goods = Goods::onlyTrashed()->get();
6.6.3、恢复软删除数据
恢复一条
$goods=Goods::find(14);
$goods->restore();
Ps:此方法有问题,无法实现恢复,暂时不知道原因。
恢复多条
Goods::withTrashed()->where('id','<',3)->restore();
恢复所有
Goods::withTrashed()->restore();
数据查询是一个频繁的操作,这里整理出来了更为方便快捷的方法,一目了然,需要什么看什么,至少比官方文档简洁不少。我是夕阳何处寻,期待能和优秀的你一同前行!
2019年9月14日
夕阳何处寻