Слияние Laravel для объединения одного и того же идентификатора

#laravel

#laravel

Вопрос:

Здравствуйте, у меня есть запрос, который уже работает, и он объединяет два запроса, но что мне нужно, так это объединить один и тот же запрос product _id , а не выводить его в другой массив.

Вот мой код:

 $first = DB::table('delivery_receipt_detail');
$first->join('delivery_receipts', 'delivery_receipt_detail.delivery_receipt_id', '=', 'delivery_receipts.id');
$first->where(function ($first) use ($start_date, $end_date) {
    $first->whereBetween('delivery_receipts.posting_date', [new Carbon($start_date), new Carbon($end_date)]);
    $first->orWhereDate('delivery_receipts.posting_date', '=', new Carbon($start_date));
    $first->orWhereDate('delivery_receipts.posting_date', '=', new Carbon($end_date));
});
$first->groupBy('delivery_receipt_detail.product_id');
$first->select('delivery_receipt_detail.product_id as delivery_product_id', DB::raw('SUM(product_qty) as delivery_product_qty'));
$result_one = $first->get();

//Sales
$query = DB::table('sale_detail');
$query->join('sales', 'sale_detail.sale_id', '=', 'sales.id');
$query->where(function ($query) use ($start_date, $end_date) {
    $query->whereBetween('sales.posting_date', [new Carbon($start_date), new Carbon($end_date)]);
    $query->orWhereDate('sales.posting_date', '=', new Carbon($start_date));
    $query->orWhereDate('sales.posting_date', '=', new Carbon($end_date));
});

$query->groupBy('sale_detail.product_id');
$query->select('sale_detail.product_id as sales_product_id', DB::raw('SUM(product_qty) as sales_product_qty'));
$test = $query->get();

$merged = $result_one->merge($test);

$result = $merged->all();

return $result;
  

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

  [
    {
    "delivery_product_id": "1",
    "delivery_product_qty": 4
    },
    {
    "delivery_product_id": "2",
    "delivery_product_qty": 1
    },
    {
    "sales_product_id": "1",
    "sales_product_qty": "3"
    },
    {
    "sales_product_id": "2",
    "sales_product_qty": "3"
    }
 ]
  

Что мне нужно, так это этот вывод

 [
    {
    "product_id": "1",
    "delivery_product_qty": 4
    "sales_product_qty": "3"
    },
    {
    "product_id": "2",
    "delivery_product_qty": 1
    "sales_product_qty": "3"
    }

 ]
  

Мне нужно объединить это и объединить один и тот же product_id и показать их разные количества.

Комментарии:

1. Просто из любопытства, почему вы вызываете каждый метод отдельно вместо объединения методов вместе?

Ответ №1:

В этом случае, я думаю, вам нужно только указать то же имя для product_id при выборе и ->merge сделает все остальное

 $first = DB::table('delivery_receipt_detail')
    ->select('delivery_product_id as product_id', 'delivery_product_qty');
// ...

$query = DB::table('sale_detail')
    ->select('sales_product_id as product_id', 'sales_product_qty');
// ...

$merged = $result_one->merge($test);
  

Комментарии:

1. он будет объединять только два запроса, но не объединять в один массив