web-dev-qa-db-ja.com

Laravelクエリビルダーはオブジェクトまたは配列を返しますか?

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のいずれかを使用でき、同じテーブルから同じものが必要なため、両方から同じタイプの結果を期待することはできませんか?

8
Tiago

get()は毎回オブジェクトのコレクションを返します。そのコレクションには、クエリの結果に応じて、0個以上のオブジェクトが含まれる場合があります。

first()は内部でget()を呼び出しますが、結果のコレクションを返す代わりに、コレクションの最初のエントリ(存在する場合)を返します。

どの方法を使用するかは、必要なものによって異なります。すべての結果のコレクションが必要ですか(get()を使用)、またはコレクションの最初の結果のみが必要ですか(first()を使用)?

17
patricus
  • Model :: find(numeric);オブジェクトを返します
  • Model :: whereId(numeric)-> first();オブジェクトを返します
  • Model :: whereId(numeric)-> get(); -コレクションを返します
  • Model :: whereId(numeric); -ビルダーを返します
0
joseph roxas