假设我有一个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']);
)。
为什么会这样?
答案 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
的更多信息