Laravelを使用して非常にシンプルなWebアプリを構築しています。
次のように、それぞれが2つの別々のビューを返す2つの別々のコントローラーを作成しました。
ProfileController:
_class ProfileController extends BaseController {
public function user($name)
{
$user = User::where('name', '=', $name);
if ($user->count())
{
$user = $user->first();
$workout = DB::table('workouts')->where('user_id', '=', $user->id)->get();
Return View::make('profile')
->with('user', $user)
->with('workout', $workout);
}
return App::abort(404);
}
}
_
WorkoutController:
_class WorkoutController extends BaseController {
public function workout($name)
{
$workout = DB::table('workouts')->where('name', '=', $name)->first();
if ($workout)
{
Return View::make('add-exercise')
->with('workout', $workout);
}
return App::abort(404);
}
}
_
私を混乱させているのは、単一のworkout
オブジェクトを各ビューに渡すために私がしなければならなかったことです。お気づきかもしれませんが、workout
のクエリビルダーは異なります。
_$workout = DB::table('workouts')->where('user_id', '=', $user->id)->get();
_
そして
_$workout = DB::table('workouts')->where('name', '=', $name)->first();
_
profile
ビューでは、->get();
メソッドを使用してオブジェクトを取得しますが、_add-exercise
_ビューでは、->first();
を使用する必要があります。インデックスが1つしかない配列。オブジェクトにアクセスできます。つまり、_$workout[0]->name
_ではなく_$workout->name
_です。
どうしてこれなの?両方のコントローラーでget
および/またはfirst
のいずれかを使用でき、同じテーブルから同じものが必要なため、両方から同じタイプの結果を期待することはできませんか?
get()
は毎回オブジェクトのコレクションを返します。そのコレクションには、クエリの結果に応じて、0個以上のオブジェクトが含まれる場合があります。
first()
は内部でget()
を呼び出しますが、結果のコレクションを返す代わりに、コレクションの最初のエントリ(存在する場合)を返します。
どの方法を使用するかは、必要なものによって異なります。すべての結果のコレクションが必要ですか(get()
を使用)、またはコレクションの最初の結果のみが必要ですか(first()
を使用)?