【发布时间】:2014-08-17 07:51:00
【问题描述】:
我有一个从数据库中检索到的字段,其中包含图像的文件名。
如果该字段为 NULL,我想将其设置为“default_image.jpg”。该图像通过许多控制器在许多页面上被引用,因此我只希望在检索时将值设为默认值。
谁能告诉我怎么做。
【问题讨论】:
-
我看过那个帖子,但我无法让它以这种方式工作 - 不知道我做错了什么。
我有一个从数据库中检索到的字段,其中包含图像的文件名。
如果该字段为 NULL,我想将其设置为“default_image.jpg”。该图像通过许多控制器在许多页面上被引用,因此我只希望在检索时将值设为默认值。
谁能告诉我怎么做。
【问题讨论】:
Accessors are what you are looking for。顾名思义,只要您尝试访问 eloquent 模型上的某个属性,就会调用访问器。
<?php
class MyModel extends Eloquent {
public function getImageAttribute($value)
{
if(is_null($value))
return 'default_image.jpg';
return $value;
}
}
更新:
仅出于说明原因:当您尝试访问类中不存在的属性时,PHP 会调用 __get() 魔术方法(如果确实存在),而不是抱怨。
Eloquent 的工作方式完全相同。当 __call() 被调用时(记住,你在 eloquent 模型上调用的属性并不真正存在)laravel 会给你数据库中那个字段的值。诀窍就在这里。
在 eloquent 模型上调用 __get() 方法时。 Eloquent 将调用它的 getAttribute() 方法,该方法获取属性但预先检查访问器是否存在(在 laravel 源访问器称为 get mutators)。你可以看到它here。
如果是这种情况,laravel 会在给定键上调用 mutateAttribute() 方法。然后mutateAttribute() 最终将调用getXAttribute (source),其中X 是正在访问的属性的名称。
这就是魔术背后的全部技巧,并再次显示了 laravel 源的结构良好。
【讨论】:
$mymodelinstance->image。