これは機能するはずです。この機能をUser
モデルに追加するだけです。
public function ads()
{
return \App\Ad::
crossJoin('users', 'users.id', '=', \DB::raw($this->attributes['id']))
->where(\DB::raw('69 * DEGREES(ACOS(COS(RADIANS(users.Latitude)) * COS(RADIANS(ads.Latitude)) * COS(RADIANS(users.Longitude - ads.Longitude)) + SIN(RADIANS(users.Latitude)) * SIN(RADIANS(ads.Latitude))))'), '<=', 'ads.radius')
->get();
}
私はより多くの仕事で可能であろうと確信しているが、あなたは、それ熱心ロードすることができなくなりますので、それは伝統的な雄弁な関係はありません。これはあなたのusers
テーブルの両方を想定し、ads
表はlongitude
とlatitude
列が含まれていることを、ユーザーの広告を見つけるために
は、あなたは単に...
$ads = (new \App\User::find($user_id))->ads();
注意を以下のような何かをするだろう。また、ads
テーブルにはradius
という列があるものとします。いくつかの列の名前を変更する必要があるかもしれませんが、必要なものを与えるはずです。
また、これはあなたの半径がマイルであることを前提としています。 69
の代わりにkmを使用する場合は、111.1111
を使用してください。
下記の返信をご覧ください。 –