Как вернуть список объектов и их количество - PullRequest
0 голосов
/ 10 июля 2020

Я хочу заменить COUNT (ID) списком объектов

Я хочу вернуть массив, содержащий список объектов, вместо того, чтобы возвращать

их количество

мой код:

$data['myresponse'] = DB::table("products")
            ->where('id_advisor',$advisor->id)->where('deleted_at', NULL)
            ->where('created_at',">=", $start)->where('created_at',"<=", $end)
            ->select(DB::raw("DATE(created_at) as date,COUNT(id) objects"))
            ->groupBy(DB::raw('Date(created_at)'))
            ->get();

ответ:

{
    "data": {
        "myresponse": [
            {
                "date": "2020-07-03",
                "objects": 2
            },
            {
                "date": "2020-07-05",
                "objects": 4
            },
            {
                "date": "2020-07-08",
                "objects": 8
            },
            {
                "date": "2020-07-09",
                "objects": 17
            }
        ]
    }
}

мне нужно вернуть что-то вроде этого:

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Я бы подошел к нему с другой стороны. Выберите объекты и поместите их в сегменты даты.

Laravel может помочь вам из коробки, сгруппировав их по атрибутам. Вам нужно только сопоставить его с желаемой структурой.

$products = DB::table("products")
    ->where('id_advisor',$advisor->id)->where('deleted_at', NULL)
    ->where('created_at',">=", $start)->where('created_at',"<=", $end)
    ->get()
    ->groupBy('created_at');

** Исходные фрагменты примера кода ** Ниже приведен некоторый (псевдокод) в качестве примера обратного подхода.

$products = DB::table("products")
    ->where('id_advisor',$advisor->id)->where('deleted_at', NULL)
    ->where('created_at',">=", $start)->where('created_at',"<=", $end)
    ->get();
    
$buckets = $products->map(
  function($product) { 
    return $product->created_at; 
  }
)->unique();

$result = $buckets->map(function ($bucket) use ($products) {
    return [
      'date' => $bucket, 
      'products' => $products->filter(
        function($product) use ($bucket) { 
          return $product->created_at === $bucket;
        }
      )
    ];
});

dd($results);

Результат дампа:

Illuminate\Support\Collection {#1050
  #items: array:3 [
    0 => array:2 [
      "date" => "2020-07-03"
      "products" => Illuminate\Support\Collection {#1048
        #items: array:1 [
          0 => array:2 [
            "date" => "2020-07-03"
            "id" => 1
          ]
        ]
      }
    ]
    1 => array:2 [
      "date" => "2020-07-04"
      "products" => Illuminate\Support\Collection {#1047
        #items: array:2 [
          1 => array:2 [
            "date" => "2020-07-04"
            "id" => 2
          ]
          2 => array:2 [
            "date" => "2020-07-04"
            "id" => 3
          ]
        ]
      }
    ]
    3 => array:2 [
      "date" => "2020-07-05"
      "products" => Illuminate\Support\Collection {#1045
        #items: array:1 [
          3 => array:2 [
            "date" => "2020-07-05"
            "id" => 4
          ]
        ]
      }
    ]
  ]
}
0 голосов
/ 10 июля 2020

попробуйте это

$data['myresponse'] = DB::table("products")
            ->where('id_advisor',$advisor->id)->where('deleted_at', NULL)
            ->where('created_at',">=", $start)->where('created_at',"<=", $end)
            ->select(DB::raw("DATE(created_at) as date, DB::raw('count(*) as objects'))
            ->groupBy(DB::raw('DATE(created_at)')) // or ->groupBy('date')
            ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...