2017-07-10 57 views
-1

出於某種原因,我得到一個錯誤:調用未定義的方法生成器僅::()

Call to undefined method Illuminate\Database\Query\Builder::only()

基本上從數據庫中獲取的條目,只使用only()收集得到具體領域

$canvas = $this->canvasRepo->get(5); 

$shapes = $canvas->shapes->each(function($shape) { 
    return $shape->only('name', 'height', 'width'); 
}); 
+0

在循環中,使用'DD($形狀);'檢查對象的信息。並將其附加到您的問題。 –

回答

2

正如指出的,這是一個關係,所以你不能使用get()。

如果您希望查詢只從數據庫中提取特定字段,則將該關係作爲方法引用而不是屬性。

$canvas->shapes()->get(['name', 'height', 'width']); 

但使用$canvas->shapes作爲屬性將執行查詢SELECT *並返回一個集合上,您可以使用pluckonly

老回答

您需要使用only()前使用get()pluck()從數據庫中獲取數據。

$canvas = $this->canvasRepo->get(5); 

$shapes = $canvas->shapes->each(function($shape) { 
    return $shape->get('name', 'height', 'width'); 
}); 

這將只返回相關的形狀'name', 'height', 'width'領域,假設你定義的關係。

但是,如果您使用急切加載來避免n + 1問題會更好。

+0

這是一個Laravel關係,不需要'get()'函數來加載這個 – Jerodev

+0

你的新的更新答案有效,但是'Old Answer'不起作用。 –

+0

很高興。請注意,這樣做效率不高,因爲它會在每次迭代中執行單獨的查詢。所以如果一個畫布有10個形狀,將會執行10個查詢。你正在拉5個畫布,這樣可以裝載50個查詢。 嘗試在canvasRepo中抓取畫布時加載形狀。 – Hamoud

-1

我認爲你應該使用pluck而不是onlytable獲得特定字段。

但它只有一個字段。所以你需要selectget的方法。

試試這個:

$shapes = $canvas->shapes->each(function($shape) { 
    return $shape->select('name','height','width'); 
})->get(); 
+0

使用'pluck'我沒有得到任何錯誤,但顯示它顯示所有的領域,而不是特定的領域。 –

+2

這將不起作用,pluck的第二個參數是用於此元素的關鍵字。 https://laravel.com/docs/5.4/collections#method-pluck – Jerodev

+0

對不起,我忘記了多個字段,我已經更新了我的答案。這可能工作。花點時間查看它。 –

0

關鍵是你怎麼知道only()方法是合法的? 在Laravel中,只有一種稱爲only()的方法,它用於檢索輸入數據的子集。 InteractsWithInput#only

編輯

收集而收集實例初始化實例$shapes將被轉換爲陣列的項目,因此你不應該使用only()方法。你可以使用由laravel助手提供的array_only()

$shapes = $canvas->shapes->each(function($shape) { 
    return array_only($shape, ['name', 'height', 'width']); 
}); 
+0

'only'是Laravel Collection的一種方法。問題是從數據庫獲取結果時,它不是集合對象。這就是爲什麼我要問這個解決方案。 –

+1

哦,我明白了。我會更新我的答案。 –

相關問題