массив манипуляции laravel без цикла for для повышения производительности и оптимизации - PullRequest
0 голосов
/ 19 марта 2019

У меня есть один JSON, как:

[
  {
    "id": 1,
    "order_id": 1,
    "product_id": 2,
    "quantity": "15.00",
    "created_at": "2019-03-19 10:02:40",
    "products": [
      {
        "id": 2,
        "name": "24 mantra",
        "sale_price": "45.00"
      }
    ]
  },
  {
    "id": 3,
    "order_id": 2,
    "product_id": 2,
    "quantity": "15.00",
    "created_at": "2019-03-19 10:16:15",
    "products": [
      {
        "id": 2,
        "name": "24 mantra",
        "sale_price": "45.00"
      }
    ]
  },
  {
    "id": 5,
    "order_id": 3,
    "product_id": 2,
    "quantity": "15.00",
    "created_at": "2019-03-19 10:16:19",
    "products": [
      {
        "id": 2,
        "name": "24 mantra",
        "sale_price": "45.00"
      }
    ]
  },
  {
    "id": 2,
    "order_id": 1,
    "product_id": 3,
    "quantity": "3.00",
    "created_at": "2019-03-19 10:02:40",
    "products": [
      {
        "id": 3,
        "name": "24 Mantra Jowar Atta 2LB",
        "sale_price": "45.00"
      }
    ]
  },
  {
    "id": 4,
    "order_id": 2,
    "product_id": 3,
    "quantity": "3.00",
    "created_at": "2019-03-19 10:16:16",
    "products": [
      {
        "id": 3,
        "name": "24 Mantra Jowar Atta 2LB",
        "sale_price": "45.00"
      }
    ]
  }
]

Теперь я хочу рассчитать общую продажу как количество, умноженное на продукт sale_price каждого объекта и сумму quantity * sale_price на продукт.

ожидаемый результат

[
  {
   "product": "24 mantra",
   "sale": 2025
  },
  {
   "product": "24 Mantra Jowar Atta 2LB",
   "sale": 270
  }
 ]

код для вывода

  $orderlines = OrderLine->with('products:id,name,sale_price')->select('id','order_id','product_id','quantity','created_at')->get();
  $orderlines = $orderlines->groupBy('product_id');
  $totalproductsale = [];

  foreach($orderlines as $key => $singleline) {
    $total_bysales = 0.00;
        foreach($singleline as $singleproduct) {
          $total_bysales += $singleproduct->quantity * $singleproduct->sale_price;
        }
   array_push($totalproductsale,array("product" => $singleline['0']->products['0']->name,"totalsale" => number_format($total_bysales, 2, '.', '')));
   $totalsale[$key] = number_format($total_bysales, 2, '.', '');
      }

Я хочу получить общую продажу и название продукта в одном объекте, для этого я использовал цикл foreach, но он очень трудоемкий, у меня есть 100 000 данных на рабочий сервер. Загрузка только 30к данных в график занимает 15 секунд. как я могу сократить время итерации или использовать другие альтернативы?

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Вы можете попробовать это, JSON, вы должны принять его к контроллеру.Я вставил JSON напрямую

$json = '[ { "id": 1, "order_id": 1, "product_id": 2, ... ]';
$array = json_decode($json, true);
$collection = collect($array);

Затем вы можете легко манипулировать данными с коллекцией

enter image description here

0 голосов
/ 19 марта 2019

Преобразование массива в коллекцию с помощью помощника collect и выполнение операций с ним.Существует множество вспомогательных функций для достижения того, что вы пытаетесь сделать, с небольшим количеством строк кода.

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