一个开发中的 Laravel 关联模型扩展

简介#

Laravel 框架提供了功能强大的关联模型,开发者可以便捷地使用关联模型加载或更新数据。但官方支持的关联关系对数据格式有较强的要求。而对于一些老项目的数据库,或是因为一些不可描述的原因导致使用了不规范的数据结构,官方的关联模型显得力不从心。

所以为了解决这些痛点,本扩展提供了一些非官方的关联模型,使用这些关联模型可以便捷地进行数据库操作

开发进度#

目前发布了一个 0.01 版本的 prerelease,实现了一部分关联模型。计划在 5 月份继续实现新功能,并且给已有的功能补全单元测试,6月发布正式版本

欢迎大家提需求和 pull request

目前支持的关联模型#

HasManyBySet#

类似于 HasMany,主模型外键($foreignKey)关联多个模型 ($related)
主模型外键格式可以是一个 set:可以是分隔符组成的字符串(如 1,3,4,6),或是一个数组([1, 3, 5, 6])
主模型外键可以使用访问器 append 数据

* Can load relation by id array or string
*
* @param $related
* @param string|null $foreignKey Format id1, id2 | array<id>
* @param string|null $relatedKey
* @param string|callable $delimiter Default ',', allows customize function or null(for array foreignKey)

HasMorphToByMapRelation#

在一些老数据库中,很可能出现一张资源表,其中一列 type (integer) 表示数据类型。Laravel 官方 MorphTo 多态关联可以使用 Relation::morphMap 的方式自定义模型和 morph_type 间的映射。该关联与官方效果相同,但是 map 是通过参数传入的。

* Can load morphTo with customize map
*
* @param  string  $name
* @param  string  $type Same as MorphTo
* @param  string  $id Same as MorphTo
* @param  string  $ownerKey Same as MorphTo
* @param  array|null $map [Morph type key name in DB => Model namespace]

HasManyBySetAndMorphToByMapRelation#

前两者的组合,适用于既需要多态关联,并且关联外键是一个 set 的情况。

* Can load morphTo with customize map and id can be a set
*
* @param  string  $name
* @param  string  $type Same as MorphTo
* @param  string  $id Same as MorphTo
* @param  string  $ownerKey Same as MorphTo
* @param  array|null $map Same as HasMorphToByMapRelation
* @param  string|callable $delimiter Same as HasManyBySetRelationship

使用方法#

composer require kamicloud/laravel-unofficial-relations`

在模型中 use 对应模型的 trait,一般名字为 (relations_name) Relation

    use HasManyBySetRelationship;

    public function test()
    {
        return $this->hasManyBySet(ModelName::class, 'foreign_key', 'related_key', 'delimiter')
    }

项目地址

php
本作品采用《CC 协议》,转载必须注明作者和本文链接
为码农摸鱼事业而奋斗
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。