2

私はLaravelプロジェクトに取り組んでおり、このクエリを雄弁なクエリに変換して、他の関係を熱心にロードできるようにしようとしています。

     $restaurants = DB::query('SELECT *,   ( 3959 * acos( cos( radians(21.420639) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-157.805745) ) + sin( radians(21.420639) ) * sin( radians( lat ) ) ) ) AS distance FROM restaurants GROUP BY id HAVING distance < 25 AND ratingsTotal > 0 ORDER BY distance LIMIT 0 , 5');

これがどのように見えるべきかについての助けは本当にありがたいです。

4

2 に答える 2

4

あなたのモデルはLaravel4でこのようになります。L3はおそらくかなり似ていますが、私はそれについてほとんどまたはまったく経験がありません。

<?php 

class Restaurant extends Illuminate\Database\Eloquent\Model
{
    protected $table = 'restaurants';

    public function getSomeShit()
    {
        return $this
            ->select('*')
            ->select(DB::raw('( 3959 * acos( cos( radians(21.420639) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians(-157.805745) ) + sin( radians(21.420639) ) * sin( radians( lat ) ) ) ) AS distance'))
            ->groupBy('id')
            ->having('distance', '<', 25)
            ->having('ratingsTotal', '>', 0)
            ->orderBy('distance')
            ->limit(5);
    }
}

複雑な(または任意の)データベースロジックをコントローラーに配置することは決してなく、常にビューの背後にあることを忘れないでください。

于 2013-01-24T21:06:51.063 に答える
0

それらの半径の計算をキャッシュしたい場合があります。それぞれが計算ごとに300から500msかかることがあります。order_by句でさらに詳しく。これをオフラインで実行し、zip-distanc-unitsをキーとしてredisキャッシュにプッシュしました。

于 2013-12-03T01:39:44.477 に答える