一個開發中的 Laravel 關聯模型擴充套件

Kamicloud發表於2019-05-04

簡介

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 協議》,轉載必須註明作者和本文連結

為碼農摸魚事業而奮鬥

相關文章