我试图在返回字段时找到一个添加一些全局行为的地方,而不是为所有模型中的所有字段定义访问器。
这促使我尝试创建一个扩展BaseModel
的{{1}}类。我的印象是,在查询模型时应该为每个字段调用。但是,似乎只在请求特定字段时调用它。
有人可以帮我理解getAttribute()
以及为什么在下面的第一个例子中没有调用它?也许有一个更好的地方来定义某种"全球访问者"行为以及我不知道的行为。谢谢!
样本模型:
getAttribute()
BaseModel:
class Thingy extends BaseModel {
}
结果:
class BaseModel extends Eloquent {
public function getAttribute($key) {
Log::alert($key);
parent::getAttribute($key);
}
}
答案 0 :(得分:1)
getAttribute()
:
$model->title;
当您从控制器返回模型时,它将转换为JSON。通过在模型上调用toArray()
来实现这一点。这不会调用getAttribute()
,但稍后会直接访问$attributes
数组。
基本上对于此类型转换(tinyint为布尔值,null为空字符串),您可以使用getAttribute()
或toArray()
两种方法。
toArray()
如果您将模型传递到服务器端视图,则getAttribute
。public function toArray(){
$array = parent::toArray();
foreach($array as $attribute){
// conversions
}
return $array;
}
public function getAttribute($key){
$attribute = parent::getAttribute($key);
// conversions
return $attribute;
}
(如果你同时使用这两种方法)
{{1}}