一个开发中的 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 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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