Laravelの学習をしていたのですが、勉強が嫌いすぎて力尽きてしまいました。

とりあえずそれっぽくは扱えるんじゃないかな?というレベルまで勉強したので、実践に入りたいと思います。

つくったもの

ゲームアプリ用の汎用ランキングシステムです。
ユニークなアプリ側のUIDを渡してあげれば、スコアと順位がjsonで返却されるようにしてみました。

気になったこと

  • データが存在しなかったとき、returnしちゃったけどいいのだろうか。いわゆるエラーハンドリングが雑。
  • コントローラー側でwhereしまくってて、検索ロジックが密結合してる気がする。普通なのだろうか?個人的には別クラスにまとめたいのだが、その場合はどこに置けばいいのだろうか・・・。
  • ORMが組み立てるSQLって、インデックスに沿ったSQLになっているのだろうか・・・。

補足

  • app_id = 汎用なので、いろんなアプリから叩かれる想定。
  • label = 汎用なので、いろんなカテゴリのスコアがある想定。

もしよかったら

ここおかしいよ、こうしたらいいよ、という助言ください・・・。

ソースコード

class RankingController extends Controller{
    public function userData(Request $request){
        $app_id     = $request->app_id;
        $user_uid   = $request->user_uid;
        $user_data  = UserData::where('app_id', $app_id)->where('user_uid', $user_uid)->first();
        if(!$user_data){
            // 1.データがなかった場合のエラー処理ってこれでいいのだろうか・・・。とりあえず-1を返してみる
            return ['status_code' => -1];
        }
        $user_id = $user_data->user_id;
        $label  = $request->label ? $request->label : "default";

        // 2. コントローラーに検索ロジック入りすぎじゃないかしら・・・。
        $ranking_data = RankingData::where('app_id', $app_id)->where('label', $label)->where('user_id', $user_id)->first();

        $score = 0;
        if($ranking_data){
            $score = $ranking_data->score;
        }

        $sort   = '>';
        if($request->sort == 'ASC'){
            $sort = '<';
        }
        $rank   = RankingData::where('app_id', $app_id)->where('label', $label)->where('score', $sort, $score)->count() + 1;

        $res    = [
            'status_code'   => 1,
            'user_id' => $user_id,
            'label' => $label,
            'score' => $score,
            'rank' => $rank,
        ];
        return $res;
    }
}

さらに補足

インデックスも含めたDB構造です。
DB構造もあんまり自信ないです。データが大量になる予定なので、インデックスを考慮したORMの実装になっているか不安です。

image