一个开发中的 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 协议》,转载必须注明作者和本文链接
为码农摸鱼事业而奋斗
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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