slim3使用Eloquent自定義分頁

最近一年私下裏寫東西一直都是在使用 slim 框架,其實說是一直在寫東西,可是到現在真的一點輸出都沒有,不過小技巧倒是學會了不少,自己寫個小驗證器啊什麼的,並且對於框架的一些理解也加深了,最好的是工作中很多都把這些小技巧用到了。

好了,吐槽了這麼多,我又要說句廢話了,寫了一年的東西才寫到分頁你敢信?不過這是真的,寫了一年了,代碼終於累計300行了,可以進入分頁的過程了。

以前用 laravel 的時候覺得 Eloquent 麻煩的很,麻煩不是指使用,而是指看代碼麻煩,不過用起來還是很爽的。所以當我在使用 slim 需要連接數據庫的時候毫不猶豫就繼續用了 Eloquent。

當我寫到分頁的時候,發現調用方法失敗,那麼就繼續引入 illuminate/pagination 好了。這下查詢有問題不能正確獲取頁碼,還有一些其他的參數也都是不對的,而且到前端的時候由於使用的模板是 twig,不能像 blade 模板那樣在代碼用調用 model 的相關方法,想要調用就得擴展 twig,那又是一樁麻煩事,既然如此,我就在代碼中調用好了,然後在輸出到模板中去,但是當我想偷懶使用 links 輸出分頁部分的時候報錯了,在看報錯,發現又得引入 blade 等一系列的東西,那引入了這麼多,還不如直接使用 laravel 算了。所以,在使用 slim 不變的情況下,我們就自己擴展一個分頁方法吧。

最初我是想繼承 model 然後在裏面寫方法的,後來發現不行,不行的原因是,model代用的大部分方法其實都是在 new 一個 builder 之後鏈式調用的,這裏我又得多說一句了奧,laravel 中同一個類名,會在很多個包下都有的,自己查看的時候要小心別看錯了。(其實,集成 model 也是可以的,就是太麻煩了,而且沒法鏈式調用)

所以在繼承 model 行不通之後,我們就從 builder 入手,通過 google 和看代碼可以找到這個方法

/**
  * Create a new Eloquent query builder for the model.
  *
  * @param  \Illuminate\Database\Query\Builder  $query
  * @return \Illuminate\Database\Eloquent\Builder|static
  */
public function newEloquentBuilder($query)
{
    return new Builder($query);
}

這個方法就是 model 裏面產生新 builder 用的,那我們就在我們的 model 中 覆蓋這個方法就好了。

<?php


namespace App\Model;

use App\Model\Builder\CustomBuilder;
use Illuminate\Database\Eloquent\Model;

class Base extends Model
{
    /**
     * Create a new Eloquent query builder for the model.
     *
     * @param \Illuminate\Database\Query\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder|static
     */
    public function newEloquentBuilder($query)
    {
        return new CustomBuilder($query);
    }
}

注意代碼裏面的 builder 引用,別引用錯了哦。

好了,CustomBuilder 就是我們自定義的 builder 了,

<?php

namespace App\Model\Builder;

use App\Utils\Paginate;
use Illuminate\Database\Eloquent\Builder;

class CustomBuilder extends Builder
{

    public function myPaginate($perPage = 15, $columns = ['*'])
    {
        // 獲取頁碼
        $page = Paginate::getPageNum();
        // 獲取 總數 和 條目
        $results = ($total = $this->toBase()->getCountForPagination())
            ? $this->forPage($page, $perPage)->get($columns)
            : $this->model->newCollection();
        // 計算總頁數
        $totalPage = $total ? ceil($total / $page) : 0;
        // 輸出
        return (object)[
            'currentPage' => $page,
            'perPage' => $perPage,
            'totalCount' => $total,
            'totalPage' => $totalPage,
            'data' => $results,
        ];
    }
}

可以看到我們定義了一個 myPaginate 方法實現我們的分頁,其實這麼做的目的只有一個覆蓋自帶分頁在輸出時候的一些操作,輸出我們想要的各種數據。接下來我們就可以在代碼和模板的任何地方使用我們輸出的數據,哪怕想實現 laravel 中 links 的方法,只要我們擴展一下 twig 就ok了,具體怎麼做呢,可以等着看下一篇文章了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章