laravel5.5手写教程4Eloquent ORM分页及软删除

Laravel 有三宝,路由、容器和 Eloquent ORM,Eloquent ORM。
我个人一直比较推荐于在实际操作中学习,之前简单了解了路由和Eloquent ORM的基本用法,今天我们继续来学习它的其他用途,在深入了解Laravel 的 Eloquent ORM之前,我们先用他做一个简单的分页功能,完成上一章CURD中少了的分页。

一、基于Eloquent ORM的分页操作:

后台分页常见基本分两种,一种是跳转分页,一种是ajax分页。
我们上一章学习了,增删改查,已经有现成的数据表和控制器等,为了测试方便,我们再往数据表里面添加几条数据。

laravel5.5手写教程4Eloquent ORM分页及软删除
添加后,我们只要修改NewsController控制器里的index方法即可来练习分页操作。

laravel5.5手写教程4Eloquent ORM分页及软删除
此时我们先注释掉第19行的代码,打印18行,打开浏览器 127.0.0.1/comment 查看:

laravel5.5手写教程4Eloquent ORM分页及软删除

此时我们打印出来的数据除了表中的前五条数据以外,我们还传递过来了当前页码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();

相关推荐