laravel5.5手寫教程4Eloquent ORM分頁及軟刪除

Laravel 有三寶,路由、容器和 Eloquent ORM,Eloquent ORM。
我我的一直比較推薦於在實際操做中學習,以前簡單瞭解了路由和Eloquent ORM的基本用法,今天咱們繼續來學習它的其餘用途,在深刻了解Laravel 的 Eloquent ORM以前,咱們先用他作一個簡單的分頁功能,完成上一章CURD中少了的分頁。php

1、基於Eloquent ORM的分頁操做:ajax

後臺分頁常見基本分兩種,一種是跳轉分頁,一種是ajax分頁。
咱們上一章學習了,增刪改查,已經有現成的數據表和控制器等,爲了測試方便,咱們再往數據表裏面添加幾條數據。數據庫

clipboard.png
添加後,咱們只要修改NewsController控制器裏的index方法便可來練習分頁操做。瀏覽器

clipboard.png
此時咱們先註釋掉第19行的代碼,打印18行,打開瀏覽器 127.0.0.1/comment 查看:學習

clipboard.png

此時咱們打印出來的數據除了表中的前五條數據之外,咱們還傳遞過來了當前頁碼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分頁時,只須要傳入相應頁碼參數,便可獲取到該頁面數據,能夠結合搜索等條件限制。url

2、軟刪除spa

1)實現軟鏈接
咱們在上一章學習了刪除模型,經過在模型實例上調用 delete 方法:rest

News::find($id)->delete();

在上面的例子中,咱們在調用 delete 方法以前會先從數據庫中取回模型。不過,若是你已知道了模型中的主鍵,則能夠不用取回模型就能直接刪除它。若要直接刪除,請調用 destroy 方法:code

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();

相關文章
相關標籤/搜索