Laravel使用自定义参数覆盖toArray

时间:2016-08-12 20:08:09

标签: laravel laravel-5

在我的控制器中我有:

$Locations = Locations::where(something);       
$Locations->get()->toArray(true);

在模型中:

function toArray($include_all = false) {
   var_dump($include_all);
}

include all变量为false,但函数被调用。 这有什么原因吗?

我想调用自定义toArray,因为我有更多oneToMany关系,我想要更改不同的结构(例如,其中一些是序列化的)

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用Illuminate\Support\Collection方法(例如map()filter())来修改集合以及该调用toArray()方法的结尾。

答案 1 :(得分:0)

覆盖相当容易,但我认为应该首先清除一些混乱。

首先,在这种情况下,您调用的toArray()方法位于Collection上,这是您在模型上使用get()时返回的对象。

话虽如此,您可以将以下内容添加到Location模型中以返回自定义集合...

public function newCollection(array $models = [])
{
    return new CustomCollection($models);
}

然后,您使用适当的命名空间编写新的CustomCollection类,以确保它自动加载,延长\Illuminate\Database\Eloquent\Collection,然后您可以继续覆盖toArray方法。

然而,您感觉就像是因为您已经在使用它而随机选择此toArray()作为执行逻辑的合适人选。您应该考虑创建一个新函数,该函数调用$this->toArray()来获取结果并根据需要修改它们并返回它。

如果您在其他型号上需要相同的功能,请继续在需要时添加newCollection方法。

这也是在文档中,可能值得一试......

https://laravel.com/docs/5.2/eloquent-collections#custom-collections