Laravel 为什么不是';toJson()中是否包含我的访问器?
我有一个模型Laravel 为什么不是';toJson()中是否包含我的访问器?,laravel,model,laravel-4,Laravel,Model,Laravel 4,我有一个模型合同,它有一个项目属性的访问器。该属性是一个“id”=>array的关联数组,但访问器将该数组转换为项目模型的集合: public function getProjectsAttribute($val) { $projects = array(); foreach($val as $projId => $projData) { $proj = new Project($this->roundingPrecision, $projD
合同
,它有一个项目
属性的访问器。该属性是一个“id”=>array的关联数组,但访问器将该数组转换为项目模型的集合:
public function getProjectsAttribute($val)
{
$projects = array();
foreach($val as $projId => $projData)
{
$proj = new Project($this->roundingPrecision, $projData);
$proj->_id = $projId;
$projects[] = $proj;
}
return Collection::make($projects);
}
如果我得到一个Contract
对象,我可以调用$Contract->projects
并按预期工作,但是,如果我将$Contract作为JSON返回(例如在响应中),则projects
节点为空。我已验证是否调用了访问器,但最终JSON不包含项目
因此,Response::json($contract)
返回一个json对象,该对象包含projects:{}
,但Response::json($contract->projects)
正确返回项目。发生这种情况可能是因为项目不是模型的属性,并且您没有将'projects'
添加到模型的$appends
属性中。(接近尾声)
更新:
发生此问题的原因是attributesToArray
方法未处理ArrayableInterface
的实例。此答案的注释中提供了方法覆盖,相关补丁已合并到laravel 4.1否,此处不是这种情况projects
是一个属性,它包含在Model的attributesToArray
函数中,但是当契约数组被传递到Response
中的json
函数时,它与Project
的集合没有任何关系,所以我进一步查看,之所以会发生这种情况,是因为eloquent没有考虑属性是ArrayableInterface的实例。如果要从自定义基础模型扩展所有模型,只需尝试将此方法放在其中:(可能需要在文件顶部放置use-illumb\Support\Contracts\ArrayableInterface;
)。我将在laravel/framework上做一次公关。这将使我走上正确的轨道。真正的问题是,经过变异的属性最终是一个集合
。我需要以某种方式递归地调用每个级别的toArray on模型,你是对的……我需要use
语句,它按预期工作。