PHP

Laravel 半期の範囲でデータを取得した Carbon whereBetween Whereのネスト

Laravel

こういう要件があった

 

  • 2020年4月スタートの計画だったら
    2020年1〜12月の範囲のデータを取得
  • 2020年9月スタートの計画だったら
    2020年7〜12月のデータを取得

 

    /**
     * 自身が関係している進行中の計画を取得
     *
     * - 現在日時の半期分である
     * - 計画に自分がリーダをしている or メンバーとして参画している
     * - 失注していない ... plans.status_id ≠ 5
     *
     * @param int $user_id - ユーザid
     * @return Illuminate\Support\Collection
     */
    public function getMyOngoingPlans($user_id)
    {
        // 現在日時の半期分のデータを取得
        $now = Carbon::now();
        $setYear = $now->year;
        if ($now->month < 7) {
            $month['start'] = Carbon::create($setYear, 1, 1)->firstOfMonth()->format('Y-m-d H:i:s'); // 1日を固定で指定
            $month['end'] = Carbon::create($setYear, 6, 1)->lastOfMonth()->format('Y-m-d H:i:s');    // 1日を固定で指定
        } else {
            $month['start'] = Carbon::create($setYear, 7, 1)->firstOfMonth()->format('Y-m-d H:i:s');
            $month['end'] = Carbon::create($setYear, 12, 1)->lastOfMonth()->format('Y-m-d H:i:s');
        }

        $myPlans = self::select(['plan_id',
                                 'plan_name',
                                 'user_name',
                                ])
                            ->whereBetween("plans.start_time", [$month['start'], $month['end']])
                            ->where('plans.status_id', '<', '5')
                            ->where('plans.deleted','=', 0)
                            ->where(function($query) use($user_id) {
                                $query->where('plans.user_ids','like','%,'.$user_id.',%')
                                    ->orWhere('plans.user_id', $user_id);
                            })
                            ->join('users','users.user_id','=','plans.user_id')
                            ->get();

        return $myPlans;
    }

Carbonを利用することで実装を行った。

 

Carbonによる日付と日付指定

 

        // 現在日時の半期分のデータを取得
        $now = Carbon::now();
        $setYear = $now->year;
        if ($now->month < 7) {
            $month['start'] = Carbon::create($setYear, 1, 1)->firstOfMonth()->format('Y-m-d H:i:s'); // 1日を固定で指定
            $month['end'] = Carbon::create($setYear, 12, 1)->lastOfMonth()->format('Y-m-d H:i:s');    // 1日を固定で指定
        } else {
            $month['start'] = Carbon::create($setYear, 7, 1)->firstOfMonth()->format('Y-m-d H:i:s');
            $month['end'] = Carbon::create($setYear, 12, 1)->lastOfMonth()->format('Y-m-d H:i:s');
        }

 

 

 

範囲指定

 

querybuilderにてwhereBetween()で対応できる

->whereBetween("plans.start_time", [$month['start'], $month['end']])

 

Whereの優先順位

 

Whereの優先順位としてネスとしたい場合は無名関数を利用する

->where(function($query) use($user_id) {
  $query->where('plans.user_ids','like','%,'.$user_id.',%')
  ->orWhere('plans.user_id', $user_id);
})

 

 

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)