【问题标题】:Why isn't my accessor being included in toJson()?为什么我的访问器没有包含在 toJson() 中?
【发布时间】:2014-06-18 08:32:17
【问题描述】:

我有一个模型Contract,它有一个projects 属性的访问器。该属性是“id”=> 数组的关联数组,但访问器将数组转换为 Project 模型的集合:

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) 返回一个包含 projects : {} 的 JSON 对象,但 Response::json($contract->projects) 正确返回项目。

【问题讨论】:

    标签: laravel model laravel-4


    【解决方案1】:

    这可能是因为项目不是模型的属性,并且您没有将 'projects' 添加到模型的 $appends 属性中。 http://laravel.com/docs/eloquent#converting-to-arrays-or-json(接近尾声)

    更新:

    由于方法attributesToArray 未处理ArrayableInterface 的实例,因此发生了问题。此答案的 cmets 中提供了方法覆盖,相关补丁已合并到 laravel 4.1

    【讨论】:

    • 不,这里不是这样。 projects是一个属性,它包含在Model的attributesToArray函数中,但是当Contract数组传递给Response中的json函数时,它对@987654332的Collection没有任何作用@
    • 所以我进一步看,这是因为 eloquent 没有考虑属性是 ArrayableInterface 的实例。如果您从自定义基本模型扩展所有模型,只需尝试将这个方法放在那里:laravel.io/bin/VqdGb(您可能需要在文件顶部放一个use Illuminate\Support\Contracts\ArrayableInterface;)。我会做一个关于 laravel/framework 的 PR。
    • 这让我走上了正轨。真正的问题是mutated 属性最终是Collection。我需要以某种方式递归调用每个级别的模型上的 toArray
    • 不,你是对的...我需要use 声明,它按预期工作。
    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多