Laravel查询构建器返回对象或数组?

时间:2015-01-27 17:24:11

标签: php laravel eloquent query-builder

我正在使用Laravel构建一个非常简单的Web应用程序。

我已经构建了两个独立的控制器,每个控制器返回两个不同的视图,如下所示:

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();,否则我将获得一个数组只有一个索引,然后我可以访问该对象,即$workout[0]->name而不是$workout->name

这是为什么?难道我不能在两个控制器中使用get和/或first,并期望两者都有相同类型的结果,因为我想从同一个表中获得同样的东西吗?

2 个答案:

答案 0 :(得分:13)

get()每次都返回一个对象集合。该集合中可能包含0个或更多对象,具体取决于查询结果。

first()调用get(),但不返回结果集合,而是返回集合中的第一个条目(如果有的话)。

您使用哪种方法取决于您的需要。您是否需要收集所有结果(使用get()),或者您只是想在集合中使用第一个结果(使用first())?

答案 1 :(得分:0)

  • Model :: find(numeric);返回一个对象
  • Model :: whereId(数字)-> first();返回一个对象
  • Model :: whereId(数字)-> get(); -返回收藏集
  • Model :: whereId(numeric); -返回建造者