【问题标题】:laravel get all places for all events where placelaravel 获取所有地点的所有地点
【发布时间】:2015-03-03 15:03:45
【问题描述】:

我终于学会了 Laravel ORM,坦率地说,这让我很沮丧,因为我的工作期限很紧。

我正在尝试最简单的事情,在几秒钟内用 SQL 轻松实现,而在使用 ORM 半小时后,我就是无法让它工作。

1 个活动有 1 个位置。在 EventModel 中:

public function place(){ 
    $this->hasOne('zwoop\models\place\PlaceModel', 'place_id'); 
} 

1 个地点可以属于许多事件。就地模型:

public function events(){ 
    $this->belongsToMany('zwoop\models\event\EventModel'); 
} 

现在在 EventModel 中,获取位置在特定范围内的所有事件的结构是什么? (例如where place.lat > input_lat and lng > input_lng(简体)。
我会给出示例代码,但我根本无法弄清楚。

这只是一个很长的查询的开始,我真的很想知道ORM最终会不会是最有效的解决方案......

【问题讨论】:

    标签: php laravel-4 orm


    【解决方案1】:

    你看过 Laravel 文档的 Querying Relations 部分吗?

    EventModel::whereHas('place', function($q) {
        $q->where('lat', '>', input_lat)
            ->where('lng', '>', input_lng);
    })->get();
    

    【讨论】:

    • 我尝试了很多东西,总是会弹出一些无意义的错误。这次是:"Call to a member function getRelationCountQuery() on a non-object"我确定是我的错,但我压力很大。
    • 没关系,谢谢你的帮助。赞成您的答案,我现在将使用查询生成器。只是有点失望,以为会更直观,但是感觉写起来比原生sql难理解。
    【解决方案2】:

    嗯。让我在这里稍微解释一下。有很多方法可以做到这一点。但最有效的方法应该是:

    1. 使用以下方法获取特定范围内的所有地点 $places = Place::where('lat', '>', input_lat)->where('lng', '>', input_lng)->get(); $places = $places->lists('id');
    2. 使用获取所有事件 ID Events::whereIn('place_id', $places)->get();

    完成了!

    当然,您可以将两者结合起来,使其成为一个查询。就我个人而言,我不喜欢混合查询,认为它应该在你的情况下给你带来一点性能提升。

    【讨论】:

    • 谢谢,不幸的是,这会给我以后的查询带来麻烦。我决定使用查询生成器并定义范围来清理它。它像这样工作得很好。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多