我遇到一种情况,我需要自动将特定属性访问器附加到我的一个模型:
class Mission extends Eloquent {
protected $appends = ['launch_date_time'];
public function getLaunchDateTimeAttribute() {
return ($this->attributes['launch_approximate'] == null) ? $this->attributes['launch_exact'] : $this->attributes['launch_approximate'];
}
}
如您所见,此launch_date_time
属性依赖于我的模型中实际位于数据库中的另外两个字段。
但是,我现在想要执行一个只返回一定数量的字段的查询,因为这将通过 AJAX 多次发送,我宁愿使用尽可能少的资源:
// AJAX GET
// missions/all
public function all() {
$allMissions = Mission::with('featuredImage')->get(['mission_id', 'name', 'featured_image']);
return Response::json($allMissions);
}
这里的问题是我不再需要 launch_date_time
属性,所以我排除了它,**这样做,我的 AJAX 请求无法成功工作:
Undefined index: launch_approximate on line 78 of H:'myproj'app'models'Mission.php
这显然是因为我的模型试图附加launch_date_time
,launch_approximate
是其中的依赖。如果我包含所有必需的依赖项,则会出现我要附加的所有属性:
$allMissions = Mission::with('featuredImage')->get(['mission_id', 'name', 'featured_image', 'launch_approximate', 'launch_exact', 'launch_date_time']);
这是不可取的。有没有可以保留两种设置的解决方案?
它不起作用的原因是,您没有在查询的 get
方法中从数据库中检索必填字段。这就是为什么无法访问launch_exact
和launch_approximate
的原因,因为它们不是在模型实例中设置的。
所以让它像你想要的那样工作。在访问它们之前,您必须检查是否设置了launch_exact
和launch_approximate
。
public function getLaunchDateTimeAttribute() {
if(isset($this->attributes['launch_approximate']) && $this->attributes['launch_exact']) {
return ($this->attributes['launch_approximate'] == null) ? $this->attributes['launch_exact'] : $this->attributes['launch_approximate'];
}
return null;
}
您还可以设置一个包含 $visible
属性的白名单和一个包含模型内部$hidden
的黑名单,以便在输出到 json 或数组时不显示某些属性 请查看文档:http://laravel.com/docs/5.1/eloquent-serialization#hiding-attributes-from-json