为什么在laravel中获取unAccessorized字段时需要Accessorized字段

时间:2016-08-25 07:25:22

标签: php laravel

假设我有一个Homework Eloquent模型:

class Homework extends Model
    {
        protected $primaryKey = 'homework_id';
        protected $dates      = ['deadline'];
        protected $appends    = ['deadline_picker'];

        protected $fillable = ['lesson_id', 'teacher', 'title', 'desc', 'deadline', 'address', 'size', 'type'];


        public function getDeadlineAttribute ($value)
        {
            return date('d/m/Y H:i', strtotime($value));
        }

        public function getDeadlinePickerAttribute ()
        {
             return date('l d F Y-H:i', strtotime($this->attributes['deadline']));
        }
}

如您所见,我为deadline_picker字段定义了一个新的访问者deadline)。

现在我想只选择此模型的title

public function Homeworks ()
{
    $homeworks =
    Homework::where('deadline', '>=', Carbon::now())->get(['title']);

    return $homeworks;

    //return view('pages/homeworks', compact('homeworks'));
}

但是在运行上面的代码之后,会显示以下错误:

ErrorException in Homework.php line 30:
Undefined index: deadline

在这种情况下,似乎需要在deadline中获取->get(['title']);字段(表示->get(['title','deadline']);)。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

这是因为您只选择了数据库中的title属性,但您的访问者期望deadline也始终存在。这样做的原因是,当您从控制器返回$homeworks时,Laravel正在使用模型上的->toArray()->toJson()方法将模型转换为json(或类似),这叫你的访问者。

您有两个选项,无论您是否真的需要,都可以随时将deadline拉出数据库,或者您可以向您的访问者添加is_null()支票,类似于以下

public function getDeadlinePickerAttribute()
{
    return is_null($this->deadline) ? null : date('l d F Y-H:i', strtotime($this->deadline));
}

Theres还有一项改进,因为您已经在模型的deadline属性上提供了$dates属性,Eloquent会自动将其转换为Carbon对象,以便您轻松操作日期不使用strtotime()或任何令人讨厌的旧日期处理函数。

public function getDeadlinePickerAttribute()
{
    return $this->deadline instanceof Carbon ? $this->deadline->format('l d F Y-H:i') : null;
}

有关Carbon http://carbon.nesbot.com/和日期变更器https://laravel.com/docs/5.3/eloquent-mutators#date-mutators

的更多信息