2016-12-17 13 views
3

Laravelが新しくなりました。Laravel Eloquent whereIn、欠落している日付を含むデータベースからのレコードの取得

私はあなたの1日の歩数を数えるアプリケーションを構築しています。
私はAPIを構築していますので、選択した日数の配列で結果がDBにない場合は0ステップを返す必要があります。

実際の手順を返して、他の日に0を返す日のデータがある場合。 私はこれ試してみました:

$steps = Step::whereIn('date', $dates) 
      ->where('user_id', Auth::id()) 
      ->get(); 

をしかし、それは唯一のマッチを返します。私が書いたように、DBの日数だけでなく、すべての日にデータを返したいと思います。してください、助けてください:)

答えて

2

DBはあなたに何かを与えることはできません、それについては知らない単純なクエリでこれは決して可能です。 結果を反復的に処理し、欠損した日付を0値で追加するか、すべての日付を含むテーブルをDBに追加して、ステップテーブルをクエリに追加したまま残すことができます。

2

実際には、リストするすべての日付の表が必要です。テーブルにレコードが存在する場合にのみ、日付を取得できるからです。もう1つの選択肢は、すべての日付に対してPHPでループを作成することですが、これは最適な解決策ではない多くのクエリを作成します。

日付表がある場合は、それをステップ表と結合することができ、COALESCEコマンドを使用できます。純粋なSQLとしてクエリを記述してから、それをEloquentクエリに変換することをお勧めします。

1

あなたは日付

を逃すために、データベースに空のレコードを追加したくない場合には、このような頭痛次のようになります。

$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/)は、毎晩処理を行い、すべてのレコードが一貫していることを確認します。

「日付を閉じる」というバックグラウンドのバッチ処理を作成し、その日付のレコードがユーザーにないレコードをデータベースに作成することを意味します。

この推奨事項はすべてを簡素化するため、コントローラは追加の計算や反復などを行うことなく通常どおりデータを取得します。

関連する問題