phl / laravel-sti
使用Eloquent的单表继承
3.0.0
2020-09-27 20:07 UTC
Requires
- php: ^7.3
- illuminate/database: ^8.0
- illuminate/events: ^8.0
Requires (Dev)
- fzaninotto/faker: ^1.8
- illuminate/pagination: ^8.0
- laravel/legacy-factories: ^1.0
- phpunit/phpunit: ^9.3
- symfony/finder: ^4.1
- symfony/var-dumper: ^4.1
README
Laravel STI
这是将单表继承(STI)引入Eloquent ORM的尝试。
此包可以在laravel应用之外使用
安装
composer require phl/laravel-sti
使用
除了使用特质和添加类型列外,无需做太多。
class Member extends Illuminate\Database\Eloquent\Model { use PHL\LaravelSTI\STI; }
Schema::create('members', function ($table) { // ... $table->type(); // ... });
现在您可以扩展Member模型。
class PremiumMember extends Member { // } class RegularMember extends Member { // }
并享受单表继承!
配置
默认情况下,无需进行任何配置。但是,您可能希望更改默认设置。
类型列
默认情况下,类型列名为type
,如果您想使用其他名称,可以在迁移和模型中指定。
class Member extends Illuminate\Database\Eloquent\Model { use PHL\LaravelSTI\STI; protected static $stiTypeKey = 'custom_type_column' }
Capsule::schema()->create('members', function ($table) { // ... $table->type('custom_type_column'); // ... });
类型值
如果您不希望类型列包含类名,可以使用Eloquent的Relation::morphMap()
函数添加名称和类之间的映射。
Relation::morphMap([ 'regular_member' => RegularMember::class, ]);
现在类型列将填充为regular_member
而不是Member
。这有助于避免将代码细节泄露到数据库中。
阅读源代码吧!
如果您对实现细节感兴趣,代码和测试已经进行了大量文档化:)