Объединение нескольких коллекций на основе общего идентификатора в PHP - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть большие коллекции авторов с такой структурой:

- authors (id, profile_id, title, name) -> this are 590 authors

У меня также есть 4 коллекции с author.id == author_id

- sales (id, author_id, salesTotal) 
- subscribers (id, author_id, subscribersTotal)
- futureEvents (id, author_id, scheduledTotal)
- reservations (id, authors_id, reservationsTotal)

Не всеу авторов есть продажи, подписчики, события будущего и / или бронирования.Коллекции не организованы в каком-либо определенном порядке.

Чтобы построить индексное представление авторов, я делаю цикл FOREACH для всех авторов, поэтому мне нужно объединить все эти пять коллекций в одинthis:

- authors (id, profile_id, title, name, sales, subscribers, futureEvents, reservations)

Как можно объединить все эти коллекции на основе author_id , имея в виду, что каждая коллекция имеет разную длинуи динамически изменяться (новые авторы могут войти в систему, новые продажи, подписчики войти или выйти и т. д.) изо дня в день.Таким образом, индекс может отображать различные значения изо дня в день

Любая идея, как?

РЕДАКТИРОВАТЬ: Я использую LARAVEL, эти коллекции являются результатом каждого издругой запрос.Например:

$authorsSubscribers = DB::table('authors')
        ->join('subscriptions', 'subscriptions.author_id', '=', 'authors.id')
        ->groupBy('authors.title')
        ->selectRaw('authors.id, COUNT(subscriptions.author_id) AS Subscribers')
        ->get(); 

В результате все мои коллекции имеют похожую структуру, такую ​​как эта:

Collection {#86071 ▼
  #items: array:5 [▼
    0 => {#86015 ▼
      +"id": 16
      +"Subscribers": 269
    }
    1 => {#86016 ▼
      +"id": 49
      +"Subscribers": 269
    }
    2 => {#86017 ▼
      +"id": 20
      +"Subscribers": 269
    }
    3 => {#86018 ▼
      +"id": 10
      +"Subscribers": 269
    }
    4 => {#86019 ▼
      +"id": 11
      +"Subscribers": 269
    }
  ]
}

Я не могу сделать только один большой гигантский запрос, потому что я группирую (GroupBy, считая (COUNT), добавляя (SUM) и т. Д.

1 Ответ

0 голосов
/ 15 февраля 2019

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

У меня есть массив trest: merge, array_map и array_combine без успеха.Поскольку массивы имеют разную структуру, длину и ключи, было невозможно отобразить один на один.

Итак, я просто использовал цикл по каждому элементу, чтобы «проходить» по каждому элементу большой коллекции, а второй цикл - зацикливаться.сравнивая каждый элемент, если author_id был равен, и если да, добавьте его в качестве атрибута.

    foreach ($authors as $author  ) {

        foreach ($sales as $sale) {
            if ($author->id === $sale->authorId) {
                $author['salesTotal'] = $sale->salesTotal;
                $author['salesAmount'] = $sale->salesAmount;
            }
        }

        foreach ($futureEvents as $events) {
            if ($author->id === $events->authorId) {
                $author['futureEvents'] = $events->futureEvents;
            }
        }
        foreach ($reservations as $reservation) {
            if ($author->id === $reservation->authorId) {
                $author['reservations'] = $reservation->reservations;
            }
        }
    }

Таким образом, я получил ОДНУ большую коллекцию для просмотра в веб-интерфейсе.Как это:

Author {#43454 ▼
  #attributes: array:14 [▼
    "id" => 1
    "profile_id" => 4
    "title" => "Missourimacejkovic.giles"
    ... lot of other attributes ...
    "created_at" => "2019-02-09 18:49:16"
    "updated_at" => "2019-02-09 18:49:16"
    "deleted_at" => null
    "subscriptions_count" => 2
    "events_count" => 19
    "salesTotal" => "9086"
    "salesAmount" => 200
    "futureEvents" => 9
    "reservations" => 450
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...