Есть ли способ слияния или объединения двух массивов, полученных из Laravel Query? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь получить объединенный массив из результата запроса двух или более запросов. Решение, которое я пробовал до сих пор, дано ниже.

Создала одну переменную $total_records и повторила ее снова в цикле foreach, чтобы получить второй набор вывода данных. Теперь я хочу объединить вывод № 2 с выводом № 1, полученным на первом месте в total_records

Есть запрос № 1:

$total_records = RatioStatistics::where('type', '=', 'group')
->whereBetween('date', [$modified_start_date, $modified_end_date])
->join('cart_abondon_group', 'statistics.ref_id', '=', 'cart_abondon_group.id')
->select('statistics.*', 'cart_abondon_group.name')
->orderBy('statistics.ref_id', 'ASC')
->orderBy('statistics.date', 'ASC')
->get();

Вывод № 1:

[{
    "id": 324985,
    "ref_id": 1,
    "date": "2019-01-02T00:00:13+00:00",
    "total": 434,
    "available": 164,
    "rented": 270,
    "unusable": 0
}, 
{
    "id": 325602,
    "ref_id": 1,
    "date": "2019-01-03T00:00:16+00:00",
    "total": 427,
    "available": 176,
    "rented": 251,
    "unusable": 0
}]

Есть еще один запрос №2:

foreach ($total_records as $record) {
    $data = [
        'total_number_of_cart_abondon_of_the_day' => Cart::where('created_at', 'like', $record['date']->format('Y-m-d') . '%')
        ->whereNotIn('status_id', [11])
        ->whereHas('product', function ($q) use ($record) {
            $q->where('group_id', $record['ref_id']);
        })
        ->count(),
        'total_number_of_cart_abondon_per_day_per_warehouse_user' => Cart::where('created_at', 'like', $record['date']->format('Y-m-d') . '%')
        ->where('warehouse_user', 1)
        ->whereNotIn('status_id', [11])
        ->whereHas('product', function ($q) use ($record) {
            $q->where('group_id', $record['ref_id']);
        })
        ->count()
    ];

    $new_stats[] = $data;
}

Вывод 2:

"0": {
    "total_number_of_cart_abondon_of_the_day": 27,
    "total_number_of_cart_abondon_per_day_per_warehouse_user": 0
}, 
"1": {
    "total_number_of_cart_abondon_of_the_day": 30,
    "total_number_of_cart_abondon_per_day_per_warehouse_user": 0
}

Запрошенный вывод:

  1. Либо у меня будетсоздать такое решение, чтобы мы могли запрашивать все через первый запрос, не выполняя второй.
  2. Или сделать второй запрос более оптимизированным, чтобы выходные данные № 2 могли быть объединены в выходные данные # 1

Правильный желаемый вывод:

[{
    "id": 324985,
    "ref_id": 1,
    "date": "2019-01-02T00:00:13+00:00",
    "total": 434,
    "available": 164,
    "rented": 270,
    "unusable": 0,
    "total_number_of_cart_abondon_of_the_day": 27,
    "total_number_of_cart_abondon_per_day_per_warehouse_user": 0
}, {
    "id": 325602,
    "ref_id": 1,
    "date": "2019-01-03T00:00:16+00:00",
    "total": 427,
    "available": 176,
    "rented": 251,
    "unusable": 0,
    "total_number_of_cart_abondon_of_the_day": 30,
    "total_number_of_cart_abondon_per_day_per_warehouse_user": 0
}]

1 Ответ

1 голос
/ 24 октября 2019

Когда вы звоните

foreach ($total_records as $record) {
    $data = [
        'total_number_of_cart_abondon_of_the_day' => Cart::where...,
        'total_number_of_cart_abondon_per_day_per_warehouse_user' => Cart::where...
    ]
}

Вы делаете дополнительные 2 sql запросов на запись.

Предполагается, что RadioStatistics является statistics моделью таблицы иCart - это cart_abondon_group модель таблицы, это можно исправить следующим образом:

  1. Создание метода отношений в RadioStatistics модель
# statistics has a foreign key (ref_id) that references cart_abondon_group's primary key (id)
public function carts()
{
    return this->belongsTo(Cart::class, 'ref_id', 'id'); // Assuming Cart is cart_abondon_group's model
}
Повторите запрос 1, чтобы он воспользовался этим:
$total_records = RatioStatistics::where('type', '=', 'group')
->whereBetween('date', [$modified_start_date, $modified_end_date])
->join('cart_abondon_group', 'statistics.ref_id', '=', 'cart_abondon_group.id')
// WithCount must be before select or it won't be added to the results
->withCount([
    'carts as total_number_of_cart_abondon_of_the_day' => function ($carts) {
        $carts->whereRaw("cart_abondon_group.created_at like concat(date_format('statistics.date', '%d-%m-%Y'), '%')")
        ->whereNotIn('status_id', [11])
        ->whereHas('product', function ($q) use ($record) {
            $q->whereRaw('group_id = statistics.id');
        });
    },
    'carts as total_number_of_cart_abondon_per_day_per_warehouse_user' => function ($carts) {
        $carts->whereRaw("cart_abondon_group.created_at like concat(date_format('statistics.date', '%d-%m-%Y'), '%')")
        ->where('warehouse_user', 1)
        ->whereNotIn('status_id', [11])
        ->whereHas('product', function ($q) use ($record) {
            $q->whereRaw('group_id = statistics.id');
        });
    }
])
->select('statistics.*', 'cart_abondon_group.name')
->orderBy('statistics.ref_id', 'ASC')
->orderBy('statistics.date', 'ASC')
->get();

Хитрая часть - это дата. Я действительно не понимаю, почему ваша схема имеет два разных формата.

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