2017-08-30 11 views
-1

私は時間範囲のセットで予約テーブルを持っています。各範囲はデータベース内に新しい行を生成します。特定のbooking_idですべての予約を照会すると、4つの配列ですべての結果が得られます。私がしたいことは、それらを1つのbooking_idの下にすべてリストすることです。PHPで配列要素をグループ化してJSONとして返す方法は?

は現在、私はこのJSONが返されます:

{ 
    "status":"success", 
    "data":[ 
     { 
      "first_name":"John", 
      "user_name":"john-k", 
      "booking_id":"3521AE", 
      "nanny_id":1, 
      "status":0, 
      "amount":"36.00", 
      "parent_id":15, 
      "date":"2017-07-02", 
      "start_time":"12:00:00", 
      "end_time":"13:00:00" 
     }, 
     { 
      "first_name":"John", 
      "user_name":"john-k", 
      "booking_id":"3521AE", 
      "nanny_id":1, 
      "status":0, 
      "amount":"36.00", 
      "parent_id":15, 
      "date":"2017-07-02", 
      "start_time":"13:00:00", 
      "end_time":"14:00:00" 
     }, 
     { 
      "first_name":"John", 
      "user_name":"john-k", 
      "booking_id":"3521AE", 
      "nanny_id":1, 
      "status":0, 
      "amount":"36.00", 
      "parent_id":15, 
      "date":"2017-07-02", 
      "start_time":"14:00:00", 
      "end_time":"15:00:00" 
     }, 
     { 
      "first_name":"John", 
      "user_name":"john-k", 
      "booking_id":"3521AE", 
      "nanny_id":1, 
      "status":0, 
      "amount":"36.00", 
      "parent_id":15, 
      "date":"2017-07-02", 
      "start_time":"15:00:00", 
      "end_time":"16:00:00" 
     } 
    ] 
} 
を私が持っていると思い何

は、このようなものです:

{ 
    "status":"success", 
    "data":[ 
     { 
      "first_name":"John", 
      "user_name":"john-k", 
      "booking_id":"3521AE", 
      "nanny_id":1, 
      "status":0, 
      "amount":"36.00", 
      "parent_id":15, 
      "date":"2017-07-02", 
      "times":[ 
       { 
       "start_time":"12:00:00", 
       "end_time":"16:00:00" 
       } 
      ] 

     } 
    ] 
} 

どのように私はこれを達成することができますか?私はコントローラでforeachを使用して、それらをbooking_idでグループ化しようとしましたが、これはまったく機能しませんでした。私のコントローラは次のとおりです。

$booking_id = Input::get('booking_id'); 
    $booking_array = []; 
    $bookings = Nanny_bookings::selectRaw('first_name, user_name, nanny_bookings.booking_id, nanny_id, status, amount, nanny_bookings.parent_id, date, start_time, end_time') 
    ->join('booking_confirmations', 'booking_confirmations.booking_id', '=', 'nanny_bookings.booking_id') 
    ->join('users', 'users.id', '=', 'nanny_bookings.nanny_id') 
    ->where('nanny_bookings.booking_id', $booking_id) 
    ->groupBy('nanny_bookings.booking_id','nanny_id', 'nanny_bookings.parent_id', 'date', 'status', 'amount', 'start_time', 'end_time') 
    ->get(); 


    foreach ($bookings as $key => &$entry) { 
     $booking_array[$entry['booking_id']][$key] = $entry; 
    } 

    $response = array(
    'status' => 'success', 
    'data' => $booking 
); 

    //if request is ajax 
    if (Request::ajax()) { 
    return Response::json($response); 
    } 
+2

どこ 'foreach'はありますか? – jeroen

+0

@jeroenが投稿しました。 – raqulka

+0

なぜdownvote?説明はありません – raqulka

答えて

0

これは実際のforeachを置き換えるための開始点です。

This code don't work if you have holes between times

// Function to check if a time is before or after another one 
function isOp($operator, $existingTime, $newTime) { 
    $newTimeInt = (int) str_replace(':', '', $newTime); 
    $existingTimeInt = (int) str_replace(':', '', $existingTime); 
    if ($operator === 'before') { 
     return ($newTimeInt < $existingTimeInt); 
    } else if ($operator === 'after') { 
     return ($newTimeInt > $existingTimeInt); 
    } 
} 


foreach ($bookings as $key => $entry) { 
    // Check if booking already exist 
    if (array_key_exists($entry['booking_id'], $booking_array)) { 
     // Booking already exist -> add time 
     if (isOp('before', $booking_array[$entry['booking_id']]['times'][0]['start_time'], $entry['start_time'])) { 
      $booking_array[$entry['booking_id']]['times'][0]['start_time'] = $entry['start_time']; 
     } 
     if (isOp('after', $booking_array[$entry['booking_id']]['times'][0]['end_time'], $entry['end_time'])) { 
      $booking_array[$entry['booking_id']]['times'][0]['end_time'] = $entry['end_time']; 
     } 
    } else { 
     // Create booking 
     $booking_array[$entry['booking_id']] = $entry; 
     // Remove start/end time, not needed on booking level 
     unset($booking_array[$entry['booking_id']]['start_time']); 
     unset($booking_array[$entry['booking_id']]['end_time']); 
     // Add first time 
     $booking_array[$entry['booking_id']]['times'] = array(
      array(
       "start_time"=>$entry["start_time"], 
       "end_time"=>$entry["start_time"] 
      ) 
     ); 
    } 
} 
+0

答えをありがとうございます。私はこのエラーが発生します:App \ Models \ Dashboard \ Nanny \ Bookings \ Nanny_bookingsのオーバーロードされた要素の間接的な変更は効果がありません – raqulka

+0

Oups、foreachループ(間違った文字)の小さな間違い 'foreach($ bookings $ key => $ entry ) '、& – Camille

関連する問題