Eloquent ORM 自定义 builder

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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 5

Macro 的使用方法不错。:relieved: 不过例子举得不好,因为你这个 page 方法 laravel 本身已经就有了。

file

3年前 评论
Mr-houzi (楼主) 3年前
游离不2

macro 方法我一般放在 provider 里

3年前 评论
Mr-houzi (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!