【问题标题】:Extending Laravel's base model扩展 Laravel 的基础模型
【发布时间】:2016-11-24 22:20:56
【问题描述】:

在 Laravel 中,所有模型都扩展了基础模型。

laravel eloquent 模型有一个名为 $dates 的受保护数组属性。添加到此数组的每个日期都会自动转换为 Carbon 实例。

我想用类似的功能扩展基本模型。例如,使用受保护的 $times 属性。所有时间属性都将被转换为 Carbon 实例

你会怎么做?

提前致谢。

【问题讨论】:

    标签: laravel-5 models extend php-carbon


    【解决方案1】:

    无论您想做什么,这都很容易。基本的 PHP 知识。

    如果您想添加一些其他字段以转换为Carbon 实例,只需将它们添加到$dates 数组中

    如果你想添加一些新的参数,只需扩展 laravel 的模型,如下所示

    <?php
    namespace App;
    
    class MyModel extends \Illuminate\Database\Eloquent\Model
    {
    
        protected $awesomness = [];
    
        /**
         *  override method
         *
         */
        public function getAttributeValue($key)
        {
            $value = $this->getAttributeFromArray($key);
    
            // If the attribute has a get mutator, we will call that then return what
            // it returns as the value, which is useful for transforming values on
            // retrieval from the model to a form that is more useful for usage.
            if ($this->hasGetMutator($key))
            {
                return $this->mutateAttribute($key, $value);
            }
    
            // If the attribute exists within the cast array, we will convert it to
            // an appropriate native PHP type dependant upon the associated value
            // given with the key in the pair. Dayle made this comment line up.
            if ($this->hasCast($key))
            {
                return $this->castAttribute($key, $value);
            }
    
            // If the attribute is listed as a date, we will convert it to a DateTime
            // instance on retrieval, which makes it quite convenient to work with
            // date fields without having to create a mutator for each property.
            if (in_array($key, $this->getDates()) && !is_null($value))
            {
                return $this->asDateTime($value);
            }
    
            //
            //
            // that's the important part of our modification
            //
            //
            if (in_array($key, $this->awesomness) && !is_null($value))
            {
                return $this->doAwesomness($value);
            }
    
            return $value;
        }
    
        public function doAwesomness($value)
        {
            //do whatever you want here
            return $value;
        }
    
    }
    

    那么你所有的模型只需要扩展\App\MyModel类而不是\Illuminate\Database\Eloquent\Model

    【讨论】: