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 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

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

file

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

macro 方法我一般放在 provider 里

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

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