biscofil/laravel-submodels

此包已被废弃,不再维护。未建议替代包。

创建 Laravel 子模型

v2.0.1 2019-10-15 06:52 UTC

This package is auto-updated.

Last update: 2020-11-15 17:16:32 UTC


README

Latest Version on Packagist Travis Total Downloads Coverage Status

在 Laravel 中创建子模型

安装

通过 Composer

composer require biscofil/laravel-submodels

使用方法

>>> User::find(1)
=> App\AdminUser {#3182
     id: 1,
     first_name: "something",
     last_name: "something"
     is_admin: true,
     admin_parameter: "something"

>>> User::find(2)
=> App\User {#3164
     id: 2,
     first_name: "something",
     last_name: "something",
     is_admin: false

为了实现此结果,每个需要扩展的模型都必须实现返回正确类的 getSubModelClass 方法,取决于条件。

class User extends Authenticatable{

    use HasSubModels;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'first_name', 'last_name', 'is_admin'
    ];

    /**
    * @param $model
    * @return string|null
    */
   public function getSubModelClass($model){
       $class = null;
       if ($model->isAdmin()) {
           $class = AdminUser::class;
       } elseif ($model->isCustomer()) {
           $class = CustomerUser::class;
       }
       return $class;
   }

   /**
     * @param $query
     * @return mixed
     */
    public function scopeAdmins($query)
    {
        return $query->where('is_admin', '=', true);
    }

}

另一方面,每个子模型可以添加包含可填充参数列表的 appendedFillable 私有属性。此列表将与父类的列表合并。对于 appendedCasts 数组也是如此。

class AdminUser extends User{

    use HasAppendedFields;

    private $appendedFillable = [
        'admin_parameter',
        'is_a_cool_admin'
    ];

    private $appendedCasts = [
         'is_a_cool_admin' => 'bool'
    ];

    public function newQuery()
    {
        return $this->scopeAdmins(parent::newQuery());
    }

}

鸣谢

许可证

许可证。请参阅许可证文件以获取更多信息。