千家信息网

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

发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,什么是ThinkSNS ?ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案。产生需求在使用 Laravel 开发 ThinkSNS P
千家信息网最后更新 2024年11月14日Laravel Model 利用 Macroable 为数据模型添加宏能力

什么是ThinkSNS ?
ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案。

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

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

trait Macroable{    use \Illuminate\Support\Traits\Macroable {        __call as macroCall;    }    /**     * Get a relationship value from a method.     *     * @param string $key     * @return mixed     * @author Seven Du      */    public function getRelationValue($key)    {        $relation = parent::getRelationValue($key);        if (! $relation && static::hasMacro($key)) {            return $this->getRelationshipFromMethod($key);        }        return $relation;    }    /**     * Handle dynamic method calls into the model.     *     * @param string $method     * @param array $parameters     * @return mixed     * @author Seven Du      */    public function __call($method, $parameters)    {        if (static::hasMacro($method)) {            return $this->macroCall($method, $parameters);        }        return parent::__call($method, $parameters);    }    /**     * Handle dynamic static method calls into the method.     *     * @param  string  $method     * @param  array  $parameters     * @return mixed     */    public static function __callStatic($method, $parameters)    {        return parent::__callStatic($method, $parameters);    }}

只要在要使用的 model 中 use 即可。

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

User::macro('questions', function () {    return $this->hasMany(Question::class, 'user_id', 'id');});

这样,我们可以直接 :

$questions = $user->questions;

拿到用户发布的所有问题了。

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

GitHub: https://github.com/slimkit/thinksns-plus(开源不易,求 Star )

模型 用户 问题 开发 数据 能力 多态 代码 功能 需求 不易 仓库 函数 创业者 别名 动态 地方 大中小企业 实际 小企业 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 国家教育和网络安全法的心得 为什么建立项目资源数据库 渠道服游戏用的服务器是 淘宝上的软件开发靠谱吗 图片服务器软件 ip网络技术的试卷 计算机数据库的角色 新乡市博古通今网络技术有限公司 服务器可以下载多少个网页 菜鸟网络技术公司官网 网络安全比赛的flag是什么 ef更新数据库 服务器安全狗白名单用处 数据库提示更新失败是什么意思 敏捷软件开发要做什么 网络技术专业的职业生涯规划 王牌竞速是什么服务器 彭州网络技术招聘信息 gpu服务器能做单机使用吗 计算机网络技术专业可以接本吗 网络安全教育情境剧 腾讯电视服务器异常 螺旋波纹代表网络安全寓意 广州系统软件开发报价 网络安全加强组织领导 广东亿街互联网科技有限公司 怎么删除后台服务器 温州网络安全知识 渭南市第五届网络安全宣传活动 科技大于互联网
0