我正在使用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
并因为我想要同一张表中的相同内容而期望两者都具有相同类型的结果吗?
get()
每次都返回对象的集合。该集合中可能包含0个或多个对象,具体取决于查询结果。
[first()
在幕后调用get()
,但不返回结果集合,而是返回集合中的第一个条目(如果有)。
您使用哪种方法取决于您的需求。您是否需要收集所有结果(使用get()
),还是只想要集合中的第一个结果(使用first()
)?