定制 mountainclans/laravel-polymorphic-model 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

mountainclans/laravel-polymorphic-model

最新稳定版本:2.0.0

Composer 安装命令:

composer require mountainclans/laravel-polymorphic-model

包简介

Пакет, добавляющий возможность хранить в одной таблице модели разных типов, имеющих общего предка

README 文档

README

Пакет, добавляющий возможность хранить в одной таблице модели разных типов, имеющих общего предка

Установка

Установите пакет при помощи Composer:

composer require mountainclans/laravel-polymorphic-model

Использование

Добавьте в родительский класс использование трейта PolymorphicModel и public static function allowedTypes(): array, возвращающий массив допустимых типов классов-наследников.

Также для корректного сохранения модели в той же таблице явно укажите в родителе, какую таблицу он использует.

Убедитесь, что в таблице присутствует поле type.

use MountainClans\LaravelPolymorphicModel\Traits\PolymorphicModel;

class YourParentModel {
    use PolymorphicModel;
    
    public const TYPE_TOP_BANNER = 'top_banner';
    public const TYPE_ADVANTAGES = 'advantages';
    
    protected $table = 'your_parent_model';
    
    public static function allowedTypes(): array
    {
        return [
            self::TYPE_TOP_BANNER => TopBannerSection::class,
            self::TYPE_ADVANTAGES => AdvantagesSection::class,
        ];
    }
}

В классах-наследниках переопределите функцию getInstanceType, возвращающую тип:

use MountainClans\LaravelPolymorphicModel\Traits\PolymorphicModel;

class TopBannerSection extends YourParentModel{
    protected function getInstanceType(): string
    {
        return static::TYPE_TOP_BANNER;
    }
}

Теперь Вы можете создавать класс-наследник напрямую и он будет сохранён в родительской таблице.

$model = new TopBannerSection();
...
$model->save();

Вы можете извлекать в рамках одного запроса любых наследников основной модели:

$collection = YourParentModel::withSubclasses()->get();

Или извлекать только модели нужного класса:

$collection = TopBannerSection::get();

Или указать нужные типы в запросе с использованием where и других конструкций:

$collection = YourParentModel::whereIn('type', [
    self::TYPE_TOP_BANNER, 
    self::TYPE_ADVANTAGES
])->get()

Количество уровней наследования моделей не ограничено.

Атрибут RequiresOverride

Внутри себя трейт PolymorphicModel использует атрибут #[RequiresOverride].

Вы можете использовать его для того, чтобы явно пометить, какие методы ваших моделей должны быть переопределены в классах-наследниках.

Обязательно объявите в классе использование трейта CheckOverrides.

use MountainClans\LaravelPolymorphicModel\Traits\CheckOverrides;
use MountainClans\LaravelPolymorphicModel\Attributes\RequiresOverride;

class YourModel extends Model {
    use CheckOverrides;
    
    #[RequiresOverride]
    public function functionForOverride() {
        
    }
}

Если переопределение не сделано, в момент выполнения метода boot модели-наследника будет выброшено исключение RequiredOverrideNotExistsException.

Тестирование

./vendor/bin/pest --stop-on-error

Авторы

Лицензия

The MIT License (MIT). Please see License File for more information.

统计信息

  • 总下载量: 17
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-06-30