您现在的位置是:自如初>LaravelLaravel

快速上手Laravel6 Eloquent ORM 增删改查

夕阳何处寻 2019-09-15 19:48:56 Laravel 2102人已围观

简介关于 Eloquent ORM 的介绍不叙述,详情请查看官方文档。这里以实操为主。最简单最直白的方式快速上手模型操作数据库。但有一点不得不说,要得心顺手的使用Laravel,就必须遵循它的规则,Laravel遵循【约定优于配置】。

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

1.png

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日

夕阳何处寻


很赞哦!(17)

文章评论

登录 注册

自如初--时间轴

站名:自如初

独白:向前走!向前走!

邮箱:457969743@qq.com

站点信息