Laravel / Eloquent Group By & Сохранить консолидированные результаты - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть база данных order_details , в которой есть информация для каждого образца и для панелей каждого образца отношений.

+-----------------+-----------------+----------+--------------------+
| order_master_id | sample_acession | panel_id | sample_description |
+-----------------+-----------------+----------+--------------------+
|               1 | AA001           |       10 | Sample 1           |
|               1 | AA001           |       11 | Sample 1           |
|               1 | AA002           |       10 | Sample 2           |
|               1 | AA002           |       13 | Sample 2           |
|               1 | AA003           |       14 | Sample 3           |
|               1 | AA003           |       15 | Sample 3           |
|               1 | AA003           |       16 | Sample 3           |
+-----------------+-----------------+----------+--------------------+

И вот что я имею для контроллера

/**
  * Return order details as samples (grouped by sample_accession)
  */
public function allOrderDetailsGroupedBySampleAccession(Request $request)
{
    // Retrieve list of all clients that have orders
    $uniqueClients = Cache::remember('billingFinanceControllerUniqueClients', 10, function () {
        // Perform DB call to get list of unique clients with business_name & id
        $uniqueClients = OrderMaster::query()
            ->leftJoin('client_master', 'order_master.client_id', '=', 'client_master.id')
            ->select('client_master.id','client_master.business_name')
            ->distinct()
            ->orderBy('client_master.business_name')
            ->get();
        return $uniqueClients;
    });

    // Start order details query
    $orderDetailsBySample = orderDetails::groupBy('sample_accession');

    // Withs
    if (!empty($request->with)) {
        $orderDetailsBySample->with($request->with);
    }

    // Set number of results per page
    $numberOfResultsPerPage = !empty($request->paginate) && is_numeric($request->paginate) ? floor($request->paginate) : 10;

    return response()->json([
        'samples' => $orderDetailsBySample->paginate($numberOfResultsPerPage),
        'unique_clients' => $uniqueClients
    ]);
}

Я пытаюсь выяснить, как вернуть данные, аналогичные приведенным ниже, где я могу затем l oop через массив панели для каждого образец возвращен.

{
  "samples": {
    "current_page": 1,
    "data": [
      "id": 9,
      "order_master_id": 1,
      "sample_acession": "AA001",
      "panel_id": 10,
      "sample_description": "Sample 1",
      "panels": [
        {
          "panel_id": 10,
          "panel_name": "Alcohol Test",
          ...
        },
        {
          "panel_id": 11,
          "panel_name": "Carbon Test",
          ...
        }
      ]
    ],
    ...
  }
}

А вот базовый c Топор ios вызов:

axios
  .get("/samples", {
    params: {
      with: [
        'panel',
      ],
    }
  })
  .then(response => {
    // Handle response
  })
  .catch(e => {
    // Handle errors
  })
  .finally(() => {
    // Perform finally tasks
  });

Я предоставил столько информации, что, по моему мнению, было бы полезно, но дайте мне знать, будет ли полезна какая-либо дополнительная информация.

...