2016-07-22 40 views
1

在下面的代碼中,$ request-> input('id')返回一個整數。我可以返回並每次看到它。或者將其設置爲一個變量並返回,以便每次都能看到它。如果我用我的代碼中的$ request-> input('id')替換爲那個整數值,我會得到我想要的,但是如果我留在變量中,它總是返回一個空集。到底是怎麼回事?我很困惑!Laravel Eloquent模型返回空集,其中的變量在where子句中

public function delete($id, Request $request) 
{ 
    $community = Community::find($id); 

    return $community->categories->where('id', $request->input('id'))->first(); 
} 

回答

1

當你做$community->categories->where(...要調用集合對象,這是關係查詢的結果上where方法。因此,從數據庫中提取數據後,您正在運行內存中的所有相關類別wherefirst

如果您確實$community->categories()->where(...您正在調用Relation對象(其本身包含Builder)上的where方法。在這種情況下,只有運行最後一個方法first(最常見的是get),並且where過濾由DBMS完成後,纔會觸發查詢,您的應用程序只會收到匹配的類別。這可能更有效率。

所以,你的問題點:

您可能會注意到Collection::where方法的簽名有第三個參數是比較是否是嚴格的,其默認值爲true。我的猜測是請求輸入以字符串形式出現,並且不嚴格匹配以int形式投射的id。

同時,Builder::where方法沒有嚴格的比較(再次,它不是執行它的PHP)。所以你不用擔心。

選項1:

return $community->categories->whereLoose('id', $request->input('id'))->first(); 

選項2(更好,在我看來):

return $community->categories()->where('id', $request->input('id'))->first(); 
+1

這是一個驚人的答案,太謝謝你了!不僅僅是解決方案,還有其背後的全部原因。非常感謝! – aylnon

相關問題