前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/diet-mng
これからダッシュボードに表示するグラフを作成するんですが、それに使用するデータの取得を行います。
今回グラフに表示するのは、最近10日間のデータのみ、という想定をしています。
public function getGraphData($user)
{
$datetimes = [];
for($i = 0; $i < 10 ; $i++) {
$datetimes[] = date('Y-m-d', strtotime('today - '.$i.' day'));
}
return $user->WeightManagements()
->whereIn(DB::raw('date_format(datetime, "%Y-%m-%d")'), $datetimes)
->get();
}
今回のポイントは特定ユーザに関連するデータのみを対象にする場合、
$user->WeightManagements()->whereIn()
という感じで、リレーションからのSQLビルダ作成、というやり方ができるらしい。
前回のホテル予約管理ではjoinやらwhereやら使いまくっててコードがごちゃごちゃしていたけど、その必要はなかった。
ただし、ここからgroupbyやら統計関連の関数を使用するとうまく行かない。
どうやら、laravelさんがget()の出力内容にuser_idなどの情報を含めているためにグループ化ができないため、SQL実行エラーとなるようです。
なので、一日の最新を取り出す、ということになると、このやり方ではSQLビルダは使用できなくって、PHP側で処理することになります。
今回はめんどくさいので、最新10日のデータ全部、としました。
きちんとtinkerで動作確認したよ。
/**
* グラフ用データを取得する
*/
public function graph(Request $request)
{
return response()->json(['datas' => $this->weightManagement->getGraphData(Auth::user())]);
}
Route::post('api/weight/graph', 'Weight\ApiController@graph');
>>> $rep->getGraphData($user)
=> Illuminate\Database\Eloquent\Collection {#3849
all: [
App\Model\WeightManagement {#3843
id: 1,
datetime: "2020-05-28 02:14:00",
weight: "80.00",
fat_rate: "17.00",
bmi: "27.00",
created_at: "2020-05-28 02:14:50",
updated_at: "2020-05-28 02:14:50",
pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3840
user_id: 1,
weight_management_id: 1,
},
},
App\Model\WeightManagement {#3844
id: 2,
datetime: "2020-05-28 02:15:00",
weight: "80.00",
fat_rate: "17.00",
bmi: "27.00",
created_at: "2020-05-28 02:15:10",
updated_at: "2020-05-28 02:15:10",
pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3841
user_id: 1,
weight_management_id: 2,
},
},
App\Model\WeightManagement {#3845
id: 5,
datetime: "2020-05-28 02:34:00",
weight: "80.00",
fat_rate: "17.00",
bmi: "28.00",
created_at: "2020-05-28 02:34:49",
updated_at: "2020-06-01 01:20:56",
pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3779
user_id: 1,
weight_management_id: 5,
},
},
App\Model\WeightManagement {#3846
id: 9,
datetime: "2020-05-31 02:44:00",
weight: "87.00",
fat_rate: "17.00",
bmi: "17.00",
created_at: "2020-05-31 02:44:36",
updated_at: "2020-05-31 02:44:36",
pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3834
user_id: 1,
weight_management_id: 9,
},
},
App\Model\WeightManagement {#3847
id: 10,
datetime: "2020-06-02 02:03:00",
weight: "87.80",
fat_rate: "15.90",
bmi: "27.00",
created_at: "2020-06-02 02:03:29",
updated_at: "2020-06-02 02:03:29",
pivot: Illuminate\Database\Eloquent\Relations\Pivot {#3848
user_id: 1,
weight_management_id: 10,
},
},
],
}