あなたは日付
を逃すために、データベースに空のレコードを追加したくない場合には、このような頭痛次のようになります。
$dates = [
'2016-12-01',
'2016-12-02',
...
'2016-12-31'
];
$records = Step::whereIn('date', $dates)
->where('user_id', Auth::id())
->get();
$steps = [];
$dates = array_flip($dates); // flipping array like: ['2016-12-01' => 0, '2016-12-02' => 1, ...]
foreach($records AS $record) { // iterating records
$steps[] = $record; // collecting records
unset($dates[$record->date]); // removing date that has record for that day
}
$dates = array_flip($dates); // flipping back: [0 => '2016-12-01', ...]
foreach($dates as $date) { // iterating dates that do not have data in db and creating model objects from them
// creating missing record "on the fly"
$Step = new Step([
'date' => $date,
'user_id' => Auth::id(),
'steps' => 0
]);
$Step->save();
$steps[] = $Step; // adding model instance to resulting array
}
usort($steps, function($a, $b) { // sorting array of steps by date
if(strtotime($a->date) > strtotime($b->date)) return 1;
if(strtotime($a->date) < strtotime($b->date)) return -1;
return 0;
});
ので、私の推薦は、いくつかのコンソールを持つことですコマンド(/app/Console/Commands/
)は、毎晩処理を行い、すべてのレコードが一貫していることを確認します。
「日付を閉じる」というバックグラウンドのバッチ処理を作成し、その日付のレコードがユーザーにないレコードをデータベースに作成することを意味します。
この推奨事項はすべてを簡素化するため、コントローラは追加の計算や反復などを行うことなく通常どおりデータを取得します。