2016-08-12 66 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