首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel子查询whereIn

Laravel子查询whereIn
EN

Stack Overflow用户
提问于 2017-08-15 07:22:02
回答 3查看 436关注 0票数 1

我在查询时遇到问题。我想执行子查询,但它不返回结果。

下面是我的代码:

代码语言:javascript
复制
        $distance_representations = Representation::select('id')
        ->where(DB::raw('round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50'))
        ->limit(10)
        ->get();

    $representations = Representation::select('id', 'city', DB::raw('round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50'))
        ->whereIn('id', $distance_representations)
        ->get();

    return view('search', array('representations' => $representations));

PostgreSQL等效项:

代码语言:javascript
复制
select id, city, round((6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude))))::numeric, 1) as distance
from representations 
where id in (
    select id
    from representations
    where round((6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude))))::numeric, 1) < 50
    limit 10
)

谢谢

EN

回答 3

Stack Overflow用户

发布于 2017-08-15 12:23:24

也许你可以试试这个

代码语言:javascript
复制
    $distance_representations = Representation::find('id')
    ->where(DB::raw('round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50'))
    ->limit(10)
    ->get();

    $representations = Representation::all()
    ->where(DB::raw('round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50'))
    ->whereIn('id', $distance_representations.id)
    ->get();

希望这能对你有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2017-08-15 12:34:47

我不明白你为什么需要子查询?除非我遗漏了什么,否则您应该能够使用单个查询选择您的数据。

代码语言:javascript
复制
$representations = Representation::selectRaw('id, city, round(6371 * acos(cos(radians(45.0)) * cos(radians(latitude)) * cos(radians(longitude) - radians(2.7)) + sin(radians(45.0)) * sin(radians(latitude)))::numeric, 1) < 50 AS distance')
    ->where('distance', '<', 50)
    ->limit(10)
    ->get();
票数 1
EN

Stack Overflow用户

发布于 2017-08-15 17:55:05

我找到了解决方案。我不能做得更好。谢谢。

这个解决方案是有效的!

代码语言:javascript
复制
$representations_with_distance = Representation::select('id', 'city', DB::raw('round(6371 * acos(cos(radians(?)) * cos(radians(latitude)) * cos(radians(longitude) - radians(?)) + sin(radians(?)) * sin(radians(latitude)))::numeric, 1) as distance'));

$representation = DB::table(DB::raw("({$representations_with_distance->toSql()}) as rd"))
    ->where('distance', '<', '?')
    ->orderBy('distance')
    ->offset(0)
    ->limit(10)
    ->setBindings([$latitude, $longitude, $latitude,  $radius])
    ->get();

return view('search', array('representations' => $representation));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45684422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档