2016-07-22 21 views
1

以下のコードでは、$ request-> input( 'id')は整数を返します。私はちょうどそれを返し、毎回それを見ることができます。あるいは変数に設定し、それを毎回見るために返します。私のコードで$ request-> input( 'id')をその整数値で置き換えると、私が探しているものが得られますが、変数に残すと常に空のセットが返されます。何が起こっている?私は困惑している!Laravel Eloquentモデルはwhere句で変数を持つ空集合を返します

あなたは関係クエリの結果であるCollectionオブジェクト、上の whereメソッド呼び出しているん $community->categories->where(...
public function delete($id, Request $request) 
{ 
    $community = Community::find($id); 

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

答えて

1

。したがって、wherefirstの両方を、データベースからフェッチした後で、メモリ内のすべての関連カテゴリで実行しています。

$community->categories()->where(...を行った場合は、リレーションオブジェクト(それ自体がビルダを含む)に対してwhereメソッドを呼び出しています。この場合、最後のメソッドfirst(たいていはget)を実行し、whereのフィルタリングがDBMSによって実行され、アプリケーションが一致するカテゴリのみを受信するまで、クエリはトリガされません。これはより効率的かもしれません。

そうでは、あなたの質問のポイントに:

あなたはCollection::whereメソッドのシグネチャは比較が厳格であるかどうか、デフォルトはtrueである三番目のパラメータを持っていることに気づくことがあります。私の推測では、要求入力は文字列として来て、intとしてキャストされたIDと厳密には一致しません。

一方、Builder::whereメソッドは厳密な比較を行いません(これはPHPを実行するPHPではありません)。だからあなたはそこに心配はありません。

オプション1:

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

オプション2(私の意見では、より良い):

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

驚くべき答えた、とそんなにありがとう!だけでなく、ソリューションだけでなく、それの背後にある完全な理由。非常に高く評価! – aylnon

関連する問題