php - 如何在 Laravel 中执行此操作,使用 join 进行子查询

标签 php mysql laravel-4 eloquent

我正在使用 Laravel 4 重做我的网站。最困难的部分是将我的查询转换为 Query Builder/Eloquent 格式。如果有人能帮我弄到这个,最长的一个,我将不胜感激!

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

最佳答案

您不需要连接和子选择。这应该适合您:

DB::table('zipcode')
->select(['zipcode','city','state','lat','lang',
    DB::raw("(3963.17*ACOS(COS(RADIANS(latpoint))*COS(RADIANS(lat))*COS(RADIANS(longpoint)-RADIANS(lng))+SIN(RADIANS(latpoint))*SIN(RADIANS(lat)))) 
        AS distance_in_mi, $current_lat AS latpoint, $current_lng AS longpoint, 10 AS r")])
->orderBy('distance_in_mi')
->havingRaw('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))))
    AND distance_in_mi <= r')
->get();

关于php - 如何在 Laravel 中执行此操作,使用 join 进行子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23123263/

相关文章:

php - 使用 Paypal php rest SDK 汇款

php - Laravel Mail 与 swiftmailer 之间的区别

php - symfony3中的功能测试,提交表单后访问容器

javascript - 删除 PHP Mailer 发送的 header

php - Array_map 通过对象数组并抓取属性

php - 使用 MySQL PHP 进行基于时间的 IP block

php - 使用 php 从数据库获取数据并作为电子邮件附件发送

mysql - 从文件或本地表获取 SQL QUERY 的 WHERE IN 过滤器的输入列表

mysql - 选择不同的行,将它们转换为列并计算值

php - 拉维尔 4 : Class does not exist