快速上手Laravel6 Eloquent ORM 增删改查

作者: 温新

分类: 【Laravel】

阅读: 5204

时间: 2019-09-15 11:48:56

关于 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日

夕阳何处寻

请登录后再评论