Laravel 查询生成器返回对象或数组?

Posted

技术标签:

【中文标题】Laravel 查询生成器返回对象或数组?【英文标题】:Laravel query builder returns object or array? 【发布时间】:2015-03-26 09:51:37 【问题描述】:

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

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

配置文件控制器:

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);
    

锻炼控制器:

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() 的结果可能包含无、一个或多个对象;所以你总能拿回一个收藏;而first() 只会返回一个对象或一个对象,因此它可以返回一个直接对象而不需要集合 如果您来自每个var_dump($workout),每个对象是什么?如果我记得,->get() 应该返回一个结果集合,而->first() 应该返回一个代表单行的对象。 那是你需要让它手动的东西......!! Laravel 不能为你做到这一点..!! :) 【参考方案1】:

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

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

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

【讨论】:

如果没有找到行first()返回null “在哪里”呢?它返回什么? @EricMcWinNEr 有两种基本的查询函数类型:修饰符和执行器。修饰符(where()select()orderBy() 等)在执行前修改查询。修改函数返回查询构建器对象,以便您可以继续修改它,或者最终使用执行语句(get()first()count()exists() 等)执行它。执行语句返回查询结果。 非常感谢帕特里克斯,一开始我很困惑,在再次查看文档后我想通了。谢谢你的解释。【参考方案2】: 型号::find(numeric);返回一个对象 Model::whereId(numeric)->first();返回一个对象 Model::whereId(numeric)->get(); - 返回一个集合 型号::whereId(numeric); - 返回一个构建器

【讨论】:

以上是关于Laravel 查询生成器返回对象或数组?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5查询生成器记录集数组

Laravel 查询生成器选择数组内的返回列

查询生成器获取结果数组而不是 Laravel 中的对象

Laravel 5.2 查询生成器作为单个数组(不是 2D 或 3D)

我不会在 laravel 中的数组或对象中获得价值

如何将数组作为 Laravel 查询生成器的 SELECT 参数传递