2016-08-12 67 views
0

在我的控制,我有:Laravel覆盖指定者自定义参数

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

和模型里面:

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

将包括所有的变量是假的,虽然功能被调用。 它有这样做的原因吗?

我想调用自定义的指定者,因为我有,我想换不同的结构更一对多关系(其中一些是序列化为例)

谢谢

回答

1

可以使用Illuminate\Support\Collection等方法如map()filter()修改集合并在结束时调用toArray()方法。

+0

是的,但我将不得不使用 - >地图()每次我做数据库的时间查询,我想在模型的toArray()函数内部执行它,所以我不需要复制代码 – Scobee

+0

你可以编写一个包含所有逻辑的函数,例如: 'function myFunc($ arg){return //映射逻辑}''Model :: someQuery() - > get() - > map('myFunc') - > toArray();' 'toArray()'的作业只是将项目集合转换为数组,没有更多。 – Morilog

+0

还应该注意''get''总是返回'Illuminate \ Support \ Collection'的一个实例。此外,' - > toArray()'是由'Illuminate \ Support \ Collection'提供的一种方法,因此覆盖它似乎不是一种理智的方法。该映射确实看起来像是去这里的正确方法。 – Ohgodwhy

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