如何在具有子查询的以下查询中不使用 DB

Posted

技术标签:

【中文标题】如何在具有子查询的以下查询中不使用 DB【英文标题】:How not to use DB in the following query having a subquery 【发布时间】:2018-05-18 08:57:41 【问题描述】:

我有以下函数来使用Haversine公式计算两点之间的距离:

public static function getByDistance($distance)

    $pubsFiltered = DB::select(
        'SELECT * FROM
                (SELECT *, (6371 * acos(cos(radians(40.4169473)) * cos(radians(latitude)) *
                cos(radians(longitude) - radians(-3.7035285)) +
                sin(radians(40.4169473)) * sin(radians(latitude))))
                AS distance
                FROM pubs) AS distances
            WHERE distance < ' . $distance . '
            ORDER BY distance
            ;
        ');

    return $pubsFiltered;

这是返回一个数组而不是一个集合,这正是我所需要的。

如果我将 DB 更改为 Pub,它会返回一个错误,因为我使用我的表“pubs”计算“距离”的子查询。

如何更改整个函数或仅更改子查询以获得我的 Pub 模型实例?...我必须在 mysql 中使用设置/声明变量吗?

非常感谢!!

【问题讨论】:

你能不能不只是做$result = collect($pubsFiltered); 让它成为一个集合? 【参考方案1】:

$pubs = Pubs::hydrate($pubsFiltered)

【讨论】:

一些额外的信息而不是一行代码将极大地帮助这个答案,并避免它被标记为删除(就像这个一样!)。 我同意 Rob Quincey 的观点。编辑此帖子,否则将被删除。【参考方案2】:

目前,我正在使用此查询来获取附近的记录:

public function scopeNearby($query, $lat, $long, $distance = 10)

    if($lat AND $long) 
        // 3959 for miles, 6371 for kilometers
        $distanceQuery = '(6371 * acos(cos(radians(?)) * cos(radians(geo_lat)) * ' . 
            'cos(radians(geo_long) - radians(?)) + sin(radians(?)) ' .
            '* sin(radians(geo_lat))))';

        return $query->select('*', DB::raw("$distanceQuery as distance"))
                ->addBinding([$lat, $long, $lat], "select")
                ->whereNotNull('geo_lat')
                ->whereNotNull('geo_long')
                ->whereRaw("$distanceQuery < ?")
                ->addBinding([$lat, $long, $lat, $distance], "where")
                ->orderBy('distance', "ASC");
    

您可能注意到我在SELECTWHERE 子句中都使用了$distanceQuery。当此范围与 paginate() 方法一起使用时,我目前遇到问题。这可能需要一些重构,但现在您可以这样做。

【讨论】:

以上是关于如何在具有子查询的以下查询中不使用 DB的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中如何在查询中不带参数的 groupBy Url

如何查询和排序 Mongoose 子文档

如何改进具有多个子查询的 SELECT 语句

SQL 查询 (Pro*C) 如何能够找到 db 表中不存在的一组值

SQLAlchemy - 过滤子查询负载

如何列出列中的所有值,然后在子查询中不重复就列出?