Eloquent ORM 自定義 builder

Mr-houzi發表於2020-08-18

Eloquent ORM 無疑是非常強大的,為開發者提供了許多好用的查詢構造器。有時候,現有的查詢構造器不能滿足我們的要求時,我們也可以自定義。

模型層父類繼承 Eloquent Model ,在構造方法中利用 macro 註冊自定義的 builder。示例程式碼如下:

class Model extends \Illuminate\Database\Eloquent\Model
{
    public function __construct(array $attributes = [])
    {

        /**
         * 自定義 builder
         */

        /**
         * page() 方法
         * 引數: $page 頁數 ;$limit 每頁展示多少條
         * 使用方法:query鏈式呼叫
         */
        \Illuminate\Database\Query\Builder::macro('page', function ($page, $limit) {
            return $this->limit($limit)->offset(($page - 1) * $limit);
        });

        parent::__construct($attributes);
    }
}

Users 模型繼承自 Model,在控制器中使用如下示例。

class UsersController extends Controller
{
    public function index()
    {
        // TODO:接收引數 $page 和 $limit

        $result = [
            'list' => Users::query()->with('XXX')->page($page, $limit)->get(),
            'total' => Users::select('id')->count(),
        ];

        return json(200, $result);
    }
}

finished!

PS:其實文中自定義的 page() ,與 Eloquent Model 中自帶方法 perPage() 功能一致,所以自定義 page() 方法僅作示例使用。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章