【问题标题】:Convert this complex query to ORM or Laravel Query Builder将此复杂查询转换为 ORM 或 Laravel Query Builder
【发布时间】:2014-05-30 09:37:15
【问题描述】:

我整天都在尝试将此查询转换为与 laravel 兼容的查询。我在查询中找不到任何有关使用 AS 的信息。任何帮助将不胜感激。

SELECT zipcode, city, state, lat, lng, distance_in_mi
    FROM (
    SELECT zipcode, city, state, lat, lng, r, ( 3963.17 * ACOS( COS( RADIANS( latpoint ) ) * COS(        RADIANS( lat ) ) * COS( RADIANS( longpoint ) - RADIANS( lng ) ) + SIN( RADIANS( latpoint ) ) * SIN( RADIANS( lat ) ) ) ) AS distance_in_mi
    FROM zipcode
    JOIN (
    SELECT $current_lat AS latpoint, $current_lng AS longpoint, 10 AS r
    ) AS p
    WHERE lat
    BETWEEN latpoint - ( r /69 ) 
    AND latpoint + ( r /69 ) 
    AND lng
    BETWEEN longpoint - ( r / ( 69 * COS( RADIANS( latpoint ) ) ) ) 
    AND longpoint + ( r / ( 69 * COS( RADIANS( latpoint ) ) ) )
    ) d
    WHERE distance_in_mi <= r
    ORDER BY distance_in_mi

这是我目前所拥有的:

$data_object = DB::table('zipcode', function($query)
            {
        $query->select('zipcode, city, state, lat, lng, r, ( 3963.17 * ACOS( COS( RADIANS( latpoint ) ) * COS( RADIANS( lat ) ) * COS( RADIANS( longpoint ) - RADIANS( lng ) ) + SIN( RADIANS( latpoint ) ) * SIN( RADIANS( lat ) ) ) ) AS distance_in_mi')
          ->from('zipcode')
          ->join('zipcode', function($query1)
            {
            $query1->select("($current_lat AS latpoint, $current_lng AS longpoint, 10 AS r) AS p")
                    ->whereBetween('lat', 'latpoint - ( r /69 )' )
                    ->whereBetween('lng', 'longpoint - ( r / ( 69 * COS( RADIANS( latpoint ) ) ) ) AND longpoint + ( r / ( 69 * COS( RADIANS( latpoint ) ) ) )' );

            });
            })
            ->where('distance_in_mi', '<=', 'r')
                    ->orderBy('distance_in_mi')
                    ->get();

【问题讨论】:

  • 到目前为止您尝试过什么?还请查看文档:laravel.com/docs/queries
  • 是的,我现在打开了文档。我需要弄清楚如何在 laravel 的查询生成器中处理 AS。在文档中找不到它。

标签: php mysql orm laravel-4


【解决方案1】:

基于this question

然后回答:

Laravel 支持使用 AS 的表和列的别名。试试

$users = DB::table('really_long_table_name AS t')
           ->select('t.id AS uid')
           ->get();

基于此,您可以创建您的查询,并且只需将 AS 放在 select 或表中。

【讨论】:

  • 看起来像我所追求的。一旦我确定它,我会发布我的查询。在我的查询正常工作之前,我不想关闭它。
猜你喜欢
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2021-02-04
  • 2015-03-16
  • 1970-01-01
  • 2015-05-12
  • 2018-09-13
相关资源
最近更新 更多