代码之家  ›  专栏  ›  技术社区  ›  Sasha

laravel 5.6-db select对数组上的成员函数join()的调用

  •  0
  • Sasha  · 技术社区  · 8 年前

    我有以下疑问:

    $clinics =  \DB::select('SELECT * FROM
    (SELECT *,
     (100 * acos(cos(radians(' . $lat . ')) * cos(radians(lat)) *
     cos(radians(lng) - radians(' . $lng . ')) +
     sin(radians(' . $lat . ')) * sin(radians(lat))))
     AS distance
     FROM clinics) AS distances
     WHERE distance < 100
     ORDER BY distance')
     ->join('countries', 'clinics.country_id', '=', 'countries.id');
    

    运行时出现以下错误:

    Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR)
    Call to a member function join() on array
    

    有可能表演吗 加入 有这个问题吗? 我试着加上 加入 在select查询中,但我得到一个错误:

    Column not found: 1054 Unknown column 'clinics.country_id' in 'on clause' (SQL: SELECT * FROM (SELECT *, (100 * acos(cos(radians(43.1557012)) * cos(radians(lat)) * cos(radians(lng) - radians(22.5856811)) + sin(radians(43.1557012)) * sin(radians(lat)))) AS distance FROM clinics) AS distances JOIN countries ON countries.id = clinics.country_id WHERE distance < 100 ORDER BY distance)
    

    有疑问的问题是:

    $clinics =  \DB::select('SELECT * FROM
        (SELECT *,
         (100 * acos(cos(radians(' . $lat . ')) * cos(radians(lat)) *
         cos(radians(lng) - radians(' . $lng . ')) +
         sin(radians(' . $lat . ')) * sin(radians(lat))))
         AS distance
         FROM clinics) AS distances
         JOIN countries ON countries.id = clinics.country_id
         WHERE distance < 100
         ORDER BY distance');
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Namoshek    8 年前

    根据我所看到的,子查询不是必需的,您可以将查询转换成Laravel符号,如:

    $clinics = Clinic::join('countries', 'countries.id', '=', 'clinics.country_id')
        ->selectRaw('clinics.*, countries.*, (
            100 * acos(
                cos(radians(?)) *
                cos(radians(lat)) *
                cos(radians(lng) - radians(?)) +
                sin(radians(?)) * sin(radians(lat))
            )
        ) as distance', [$lat, $lng, $lat])
        ->having('distance', '<', 100)
        ->orderBy('distance')
        ->get();
    

    您可能需要明确列出要选择的列 countries 桌子,因为 countries.* 您将覆盖例如 id 你的专栏 clinics 表。我补充说 国家* 因为我想这就是你加入后想做的。

    推荐文章