gpt4 book ai didi

laravel - 在 Eloquent 中使用预先加载对计算列进行查询和过滤

转载 作者:行者123 更新时间:2023-12-05 01:02:11 28 4
gpt4 key购买 nike

我目前有三个模型,其中包含一个使用 Eloquent 加载的有效 Eloquent 查询。我的模型具有以下关系:

class Template extends Eloquent {
public function user() {
return $this->belongsTo('User');
}
}

class User extends Eloquent implements UserInterface, RemindableInterface {
public function profiles() {
return $this->hasMany('Profile');
}
public function templates() {
return $this->hasMany('Template');
}
}

class Profile extends Eloquent {
public function user() {
return $this->belongsTo('User');
}
}

我的工作查询如下所示:
$templates = Template::with('user', 'user.profiles')
->where('public', '=', true)
->whereIn('type', $search_types)
->where('user_id', '!=', $user->id)
->paginate(8);

这似乎工作得很好,但我需要再添加一件事,这对我来说很难做到。我需要使用现有的 lat 更改此查询以考虑模板用户与当前用户的距离和 long user 中的列 table 。我只希望查询返回其用户在当前用户 25 英里范围内的模板(最好按距离排序,但该部分是可选的)。

我试图将自定义计算列添加到用户关系中,如下所示:
$templates = Template::with(array('user' => function($query) use($user) {
$query->select('*')->selectRaw('(3959 * acos(cos(radians(?)) * cos(radians(lat)) * cos(radians(long) - radians(?)) + sin(radians(?)) * sin(radians(lat)))) AS distance', array($user->lat, $user->long, $user->lat));
}, 'user.profiles' => function($query) {
$query
}))
->where('public', '=', true)
->whereIn('type', $search_types)
->where('user_id', '!=', $user->id)
->having('distance', '<=', 25)
->orderBy('distance')
->paginate(8);

这不起作用,因为在急切加载时, distance初始查询中不存在列,导致它在 having 处失败条款。如果我将该部分移动到匿名函数中并删除排序,它不会立即失败,但它只是忽略模板查询的距离,然后只抓取 25 英里内的相关用户,这似乎不是有帮助。

使用 Eloquent 获取我想要的数据的正确方法是什么?

最佳答案

我最终得到了以下内容(没有可选的排序),这似乎工作得很好:

$templates = Template::with('user', 'user.profiles')
->where('public', '=', true)
->whereIn('type', $search_types)
->where('user_id', '!=', $user->id)
->whereHas('user', function($query) use($user, $distance) {
$query->whereRaw('(3959 * acos(cos(radians(?)) * cos(radians(location_lat)) * cos(radians(location_long) - radians(?)) + sin(radians(?)) * sin(radians(location_lat)))) <= ?', array($user->location_lat, $user->location_long, $user->location_lat, $distance));
})
->paginate(8);

关于laravel - 在 Eloquent 中使用预先加载对计算列进行查询和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26863765/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com