一个开发中的 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')
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: