laravel5.5手写教程4Eloquent ORM分页及软删除
Laravel 有三宝,路由、容器和 Eloquent ORM,Eloquent ORM。
我个人一直比较推荐于在实际操作中学习,之前简单了解了路由和Eloquent ORM的基本用法,今天我们继续来学习它的其他用途,在深入了解Laravel 的 Eloquent ORM之前,我们先用他做一个简单的分页功能,完成上一章CURD中少了的分页。
一、基于Eloquent ORM的分页操作:
后台分页常见基本分两种,一种是跳转分页,一种是ajax分页。
我们上一章学习了,增删改查,已经有现成的数据表和控制器等,为了测试方便,我们再往数据表里面添加几条数据。
添加后,我们只要修改NewsController控制器里的index方法即可来练习分页操作。
此时我们先注释掉第19行的代码,打印18行,打开浏览器 127.0.0.1/comment 查看:
此时我们打印出来的数据除了表中的前五条数据以外,我们还传递过来了当前页码current_page,最后页码last_page,以及下一条页码url next_page_url,可以看出我们可以通过这种方式传递参数给API,进行跳转分页。
页链接为http://127.0.0.1:9999/comment/?page=页码数;即可实现分页。
下面我们来看ajax分页,Eqoluent ORM是一个很完美地数据库应用层组件,依然提供了分页所需要的各种参数,以满足参数传值的分页。
打开19行注释,注释掉18行,重新打印,可以发现打印出来的数据不变,此时我们改变控制器中
var_dump(News::paginate(5,['*'],'page',1)->toArray()); 改为
var_dump(News::paginate(5,['*'],'page',2)->toArray());
此时我们会发现,请求到的数据已经改变了,相应的其他参数也变成了第二页的,所以如果需要ajax分页时,只需要传入相应页码参数,即可获取到该页面数据,可以结合搜索等条件限制。
二、软删除
1)实现软连接
我们在上一章学习了删除模型,通过在模型实例上调用 delete 方法:
News::find($id)->delete();
在上面的例子中,我们在调用 delete 方法之前会先从数据库中取回模型。不过,如果你已知道了模型中的主键,则可以不用取回模型就能直接删除它。若要直接删除,请调用 destroy 方法:
News::destroy(1); News::destroy([1, 2, 3]);
除此之外呢,我们还可以通过查询来删除,前面为查询条件,后面跟着的是delete();
除了从数据库中移除实际记录,Eloquent 也可以「软删除」模型。当模型被软删除时,它们并不会真的从数据库中被移除。而是会在模型上设置一个 deleted_at 属性并将其添加到数据库。如果模型有一个非空值 deleted_at,代表模型已经被软删除了。要在模型上启动软删除,则必须在模型上使用 IlluminateDatabaseEloquentSoftDeletes trait 并添加 deleted_at 字段到你的 $dates 属性上:
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class News extends Model { use SoftDeletes; /** * 需要被转换成日期的属性。 * * @var array */ protected $dates = ['deleted_at']; }
完成模型添加后,我们需要打开数据库表,给表News里面添加一字段 deleted_at 类型 为 timestamp类型,此时当我们删除数据的时候,会自动给表里该项数据这一个字段添加该段时间,等查询的时候,会过滤掉这一项不为空的数据。从而达到了软删除。
要确认指定的模型实例是否已经被软删除,可以使用 trashed 方法:
if ($news->trashed()) {
//
}
查询被软删除的模型#
包含被软删除的模型#
如上所述,被软删除的模型将会自动从所有的查询结果中排除。不过,你可以通过在查询中调用 withTrashed 方法来强制查询已被软删除的模型:
$news = AppNews::withTrashed()
->where('id', 1) ->get();
withTrashed 方法也可以被用在 关联 查询:
$news->history()->withTrashed()->get();
只取出软删除数据#
onlyTrashed 会只取出软删除数据:
$news = AppNews::onlyTrashed()
->where('id', 1) ->get();
恢复被软删除的模型#
有时候你可能希望「取消删除」一个已被软删除的模型。要恢复一个已被软删除的模型到有效状态,则可在模型实例上使用 restore 方法:
$news->restore();
你也可以在查询上使用 restore 方法来快速地恢复多个模型:
AppNews::withTrashed()
->where('id', 1) ->restore();
与 withTrashed 方法类似,restore 方法也可以被用在 关联 查询上:
$news->history()->restore();
永久地删除模型#
有时候你可能需要真正地从数据库移除模型。要永久地从数据库移除一个已被软删除的模型,则可使用 forceDelete 方法:
// 强制删除单个模型实例...
$news->forceDelete();
// 强制删除所有相关模型...
$news->history()->forceDelete();