我有一个从数据库中检索到的字段,其中包含图像的文件名。
如果该字段为NULL,我想将其设置为' default_image.jpg'。这个图像通过许多控制器在许多页面上被引用,所以我只想在获取时将值设置为默认值。
有人可以告诉我该怎么做。
答案 0 :(得分:4)
Accessors are what you are looking for。正如名称所示,只要您尝试访问雄辩模型上的某个属性,就会调用Accessors。
<?php
class MyModel extends Eloquent {
public function getImageAttribute($value)
{
if(is_null($value))
return 'default_image.jpg';
return $value;
}
}
<强>更新强>
只是为了澄清原因:当您尝试访问类中不存在的属性时,PHP会调用__get()
魔术方法(如果确实存在),而不是抱怨。
Eloquent以同样的方式工作。当调用__call()
时(请记住,您在一个雄辩模型上调用的属性并不存在)laravel将为您提供数据库中该字段的值。诀窍在这里。
在雄辩的模型上调用__get()
方法时。 Eloquent会调用它的getAttribute()
方法来获取属性,但会事先检查访问者是否存在(在laravel源访问器中称为 get mutators )。你可以看到它here。
如果是这种情况,laravel会调用给定密钥上的mutateAttribute()
方法。然后mutateAttribute()
将最终调用getXAttribute
(source),其中X
是要访问的属性的名称。
这就是魔术背后的全部技巧,再次展示了结构化的层次结构的来源。