Laravel Model 利用 Macroable 为数据模型添加宏能力

简介:

简单的说一下宏能力,这个类是 Illuminate\Support\Traits\Macroable 其中利用重载实现了可以定义宏的功能,即通过 macro 静态方法添加回调,并定义一个名字。利用 __call 当前类没有这个函数的时候执行这个函数名注册的回调。

产生需求

在使用 Laravel 开发 ThinkSNS Plus 的时候,因为很多功能块都没有写在一个库里面,利用拓展包的形式添加实际功能,里面很多地方也用到了“多态多对多”的关系。问题来了,开发一个问答程序,想要给用户模型增加发布的问题或者回答的关系,起初是继承一份 User 模型,添加了关系,之后就发现问题了,因为用户的 tag 是使用多态多对多的关系,我通过继承的用户模型是无法拿到这种关系数据的因为 *able_type 是 user 数据模型类名称或者别名。而我继承之后类也就发生改变了。

完成需求

随之想到,在 Laravel 中有一个 Trait 叫做 Macroable 然后发现 Builder 都有这种能力,而 Model 没有,随之也将这个 Trait 添加到要使用的model上,后来发现,如果其他模型也要用是不是也要再添加一次?随之写了一份 Trait :
_1_1_
_1_2
只要在要使用的 model 中 use 即可。

使用

有了这个 Trait 那么我们添加到 User 模型中,就可以使用宏能力为其动态添加函数了:

User::macro('questions', function () {

return $this->hasMany(Question::class, 'user_id', 'id');

});

_2
这样,我们可以直接 :
_3
拿到用户发布的所有问题了。

以上代码都来自于ThinkSNS Plus,看完整的开发代码可以看仓库:

GitHub: https://github.com/slimkit/thinksns-plus
(开源不易,求 Star )
ThinkSNS体验地址:http://www.thinksns.com/experience.html

目录
相关文章
|
16天前
|
JSON 计算机视觉 数据格式
LangChain-17 FunctionCalling 利用大模型对函数进行回调 扩展大模型的额外的能力 比如实现加减乘除等功能
LangChain-17 FunctionCalling 利用大模型对函数进行回调 扩展大模型的额外的能力 比如实现加减乘除等功能
26 4
|
2月前
|
JSON 前端开发 API
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
56 2
|
3月前
|
安全 PHP 数据库
laravel中模型中$fillable的用法
通过正确使用 `$fillable`属性,开发者可以有效地保护应用免受批量赋值漏洞的影响。它使得只有指定的字段可以被外部用户输入影响,为应用数据的安全性提供了一道防线。在开发使用Laravel框架的应用时,恰当地设置 `$fillable`或 `$guarded`属性是一项最佳实践。
110 1
|
2月前
LangChain 构建问题之定义zmng_query工具的具体实现函数如何解决
LangChain 构建问题之定义zmng_query工具的具体实现函数如何解决
26 0
|
2月前
|
机器学习/深度学习 自然语言处理 算法
LangChain 构建问题之AgentExecutor的定义如何解决
LangChain 构建问题之AgentExecutor的定义如何解决
73 0
|
4月前
|
数据库 开发者 Python
Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
|
存储 JSON 数据处理
最为常用的Laravel操作(1)-Eloquent模型
整理了 Laravel 框架 Eloquent 模型最常用的操作,包括一些常用的属性、方法,模型关联等。本系列共有 3 篇文章。
73 2
|
JavaScript 前端开发 开发者
通用feeds组件封装技巧
前端交互中,无限滚动feeds流是最常见的交互形式,常见的feeds功能上基本都包括兜底、接口请求、报错提示、刷新、feeds卡片排列规则等。用户滑动页面不断加载feeds数据, DOM节点不断累加创建,因为DOM节点过多,导致页面数据更新时卡顿问题, 一般会通过虚拟滚动减少页面DOM数量来解决。这些必要基础能力在每个feeds流需求中都存在,所以我们决定将feeds这一场景抽离成公共组件,提高开发效率。
303 0
通用feeds组件封装技巧
|
缓存 监控 NoSQL
Quick-Task 动态脚本支持框架之结构设计篇
前面两篇博文,主要是整体介绍和如何使用;接下来开始进入正题,逐步剖析,这个项目是怎么一步一步搭建起来的;本篇博文则主要介绍基本骨架的设计,围绕项目的核心点,实现一个基础的原型系统
276 0
Quick-Task 动态脚本支持框架之结构设计篇
Laravel Eloquent 关联模型 进阶使用技巧
Laravel Eloquent 关联模型 进阶使用技巧
146 0