Laravel:使用`whereHas`和`with`后关系为空?

时间:2018-05-16 18:36:02

标签: laravel-5 eager-loading laravel-query-builder

我有这个问题:

 $user =  \App\User::where('id','=',191)
            ->whereHas('addresses', function($q){
              $q->getByDistance(52.5293878, 13.3416309, 5);
            })
            ->with(['addresses' => function($q){
              $q->getByDistance(52.5293878, 13.3416309, 5);
            }])
            ->get();

dd($user);

这会选择ID为191的用户,只要他的地址在范围内,然后他也会急切地加载地址。

这是类scopeGetByDistance

中的addresses函数
public static function scopeGetByDistance($query,$lat, $lng, $max_distance)
{
  return $query->selectRaw('lat, lng, ( 3959 * acos( cos( radians( '.$lat.') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(' . $lng . ') ) + sin( radians(' . $lat .') ) * sin( radians(lat) ) ) ) AS distance')
               ->having('distance', '<', $max_distance )
               ->orderBy( 'distance', 'ASC' );
}

我选择了id 191用户,因为我知道他的地址距离坐标约为2。

这将输出用户,但关系为空。 whereHas不应该确保关系不是空的吗?我也确定他必须有一个范围内的地址。这就是关系的样子:

enter image description here

1 个答案:

答案 0 :(得分:0)

我必须将引用键添加到selectRaw,如下所示:

return $query->selectRaw('user_id, lat, lng, ( 3959 * acos( cos