Форматирование вложенного json с запросом на laravel - PullRequest
0 голосов
/ 20 сентября 2019

Как сделать вложенный JSON на эти таблицы, я хочу, чтобы результат выглядел следующим образом.

{
  "data":[
    {
      "id":2,
      "name":"miles",
      "email":"sb-o8c47x137031@personal.example.com",
      "details":[
        {
          "id":1,
          "user_id":"2",
          "product_id":"product-003",
          "label":"purchase rebate",
          "status":"unpaid",
          "amount":"2.00",
          "process_date":"2019-09-20 10:18:22"
        },
        {
          "id":2,
          "user_id":"2",
          "product_id":"product-003",
          "label":"survey answer rebate",
          "status":"unpaid",
          "amount":"2.00",
          "process_date":"2019-09-20 10:24:06"
        }
      ]
    },
    {
      "id":3,
      "name":"Jayson",
      "email":"sb-rv9me150874@personal.example.com",
      "details":[

      ]
    }
  ]
}

вот мой скрипт на стороне сервера

$merchant_users = DB::table('merchant_users as a')
    ->leftjoin('user_rebate_transactions as b', 'b.user_id','=','a.id') 
    ->select('a.id','a.name',DB::raw('SUM(b.amount) as total'),'a.email')
    ->where('b.status','unpaid')
    ->groupBy('a.id','a.name','a.email')->get();
$some1 = json_decode($merchant_users, true);            
$out = [];
foreach($some1 as $merchant_users){
    $query = DB::table('user_rebate_transactions')->select('*')
        ->where([['user_id','=',$merchant_users['id']],['status','=','unpaid']])->get();
    // echo json_encode($query);
    $out['data'][] = ['id' => $merchant_users['id'],
        'name' => $merchant_users['name'],
        'email' => $merchant_users['email'],
        'total' => $merchant_users['total'],
        'details' => $query];                
}
return json_encode($out, JSON_PRETTY_PRINT);

вот мой результат

{
  "data":[
    {
      "id":2,
      "name":"miles",
      "email":"sb-o8c47x137031@personal.example.com",
      "total":"4.00",
      "details":[
        {
          "id":1,
          "user_id":"2",
          "product_id":"product-003",
          "label":"purchase rebate",
          "status":"unpaid",
          "amount":"2.00",
          "process_date":"2019-09-20 10:18:22"
        },
        {
          "id":2,
          "user_id":"2",
          "product_id":"product-003",
          "label":"survey answer rebate",
          "status":"unpaid",
          "amount":"2.00",
          "process_date":"2019-09-20 10:24:06"
        }
      ]
    }
  ]
}

моя структура таблицы таблица торговца И таблица транзакций бонуса пользователя

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Эта строка кажется странной:

foreach($some1 as $merchant_users){

Также очистите некоторые имена, чтобы сделать вещи более читабельными:


$merchant_users = DB::table('merchant_users as a')
    ->leftjoin('user_rebate_transactions as b', 'b.user_id','=','a.id') 
    ->select('a.id','a.name',DB::raw('SUM(b.amount) as total'),'a.email')
    ->where('b.status','unpaid')
    ->groupBy('a.id','a.name','a.email')->get();

foreach ($merchant_users as $user) {
    $transactions = DB::table('user_rebate_transactions')->select('*')
        ->where([['user_id','=',$user['id']],['status','=','unpaid']])->get();
    $out['data'][] = ['id' => $user['id'],
        'name' => $user['name'],
        'email' => $users['email'],
        'total' => $users['total'],
        'details' => $transactions,
    ]; 
}

return json_encode($out, JSON_PRETTY_PRINT);

0 голосов
/ 20 сентября 2019
$merchant_users = DB::table('merchant_users')
        ->select('*')
        ->get();
        $some1 = json_decode($merchant_users, true);            
        $out = [];
        foreach($some1 as $user){
            //query the transactions rebate details
            $transaction_details = DB::table('merchant_users as a')
            ->leftjoin('user_rebate_transactions as b', 'b.user_id','=','a.id') 
            ->select('b.id','b.user_id','b.product_id','b.label','b.amount','b.status','b.process_date')
            ->where([['b.user_id','=',$user['id']],['status','=','unpaid']])
            ->get();
            //query the transactions rebate details get the total amount of rebate
            $get_total_amount_rebate = DB::table('merchant_users as a')
            ->leftjoin('user_rebate_transactions as b', 'b.user_id','=','a.id') 
            ->select(DB::raw('SUM(b.amount) as total'))
            ->where([['b.user_id','=',$user['id']],['status','=','unpaid']])
            ->get();
            $total_decode = json_decode($get_total_amount_rebate,true);
            if(isset($total_decode[0]['total']))
            {
                $total = $total_decode[0]['total'];
            }
            else{
                $total = 0;
            }                
                $out['data'][] = ['id' => $user['id'],
                'name' => $user['name'],
                'email' => $user['email'],
                'total' => $total,
                'details' => $transaction_details];
        }
        return json_encode($out, JSON_PRETTY_PRINT);

Я решил это самостоятельно, но мой код выглядит как спагетти ..... не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...