【问题标题】:Is there any way to get model object instead of stdClass object while using Laravel DB:Query Builder?在使用 Laravel DB:Query Builder 时,有什么方法可以获取模型对象而不是 stdClass 对象?
【发布时间】:2019-02-12 17:49:58
【问题描述】:

在下面的代码中,我尝试获取附近的用户和距离。一切运作良好。但下面的查询将结果返回为 stdClass 对象 但我想要用户 模型对象。有可能吗?

   $collection =  DB::table('users')
        ->join('locations as l', 'users.location_id', '=', 'l.id')
        ->select('users.*', DB::raw('(6371 * acos(cos(radians(' . $coordinates['latitude'] . ')) * cos(radians(`lat`)) * cos(radians(`lng`) - radians(' . $coordinates['longitude'] . ')) + sin(radians(' . $coordinates['latitude'] . ')) * sin(radians(`lat`)))) as distances'))
        ->having('distances', '<', 32.688888)
        ->orderBy('distances', 'ASC')
        ->get();

输出:

 Illuminate\Support\Collection Object
    (
        [items:protected] => Array
            (
                [0] => stdClass Object
                    (

                    )
             )
    )

我想要

 Illuminate\Support\Collection Object
    (
        [items:protected] => Array
            (
                [0] => App\Models\User Object
                    (

                    )
             )
    )

【问题讨论】:

    标签: laravel eloquent query-builder laravel-query-builder


    【解决方案1】:

    这是因为您使用的是查询构建器而不是模型。

    您应该能够通过以下方式实现您所追求的目标:

    $collection =  User::join('locations as l', 'users.location_id', '=', 'l.id')
        ->select('users.*', DB::raw('(6371 * acos(cos(radians(' . $coordinates['latitude'] . ')) * cos(radians(`lat`)) * cos(radians(`lng`) - radians(' . $coordinates['longitude'] . ')) + sin(radians(' . $coordinates['latitude'] . ')) * sin(radians(`lat`)))) as distances'))
        ->having('distances', '<', 32.688888)
        ->orderBy('distances', 'ASC')
        ->get();
    

    【讨论】:

    • @weaver 这部分一开始可能会让人困惑。 Illuminate\Database\Eloquent\Model 将通过__call 将呼叫转发到Illuminate\Database\Eloquent\Builder,然后将呼叫转发到\Illuminate\Database\Query\Builder。这就是为什么您可以将后两个类视为模型类的一部分,并在构建复杂查询时直接从模型中调用它们。这也适用于静态调用,例如 User::join,它将实例化一个新对象,然后调用该对象的非静态方法。见__callStatic
    • 问题的标题清楚地说明了如何使用查询生成器。如果不可能,请添加额外的信息说明,然后你的答案,因为现在,你没有回答标题中提出的问题。
    • @Silidrone 这就是我在开场白中试图达到的目标。
    猜你喜欢
    • 2010-11-19
    • 2011-07-08
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2021-04-19
    • 2023-02-26
    • 1970-01-01
    • 2015-03-15
    相关资源
    最近更新 更多