Laravel Красноречивый сбор парных предметов - PullRequest
2 голосов
/ 13 марта 2020

Я ищу способ агрегирования набора eloquent пар пользователей в Laravel. [[user][partner]]

У меня есть следующая структура таблицы пользователей

[id] [name] [partner_id]

Пользовательская сущность имеет соответствующие partner_ids или null (если партнер не существует)

| id | name          | partner_id |
+----+---------------+------------+
| 1  | John Doe      | 3          |
| 2  | J Random User | NULL       |
| 3  | Jane Doe      | 1          |
| .. | ...           | ...        |

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

[
  [
    { "id": 1, "name": "John Doe", "partner_id": 3 },
    { "id": 3, "name": "Jane Doe", "partner_id": 1 },
  ],
  [
    { "id": 2, "name": "J Random User", "partner_id": null },
  ]
]

Я не понимаю, как я получаю пользователей один раз и собираю $users коллекцию в пары в моем контроллере.

<?php

namespace App\Http\Controllers;

use App\User;

class PairController extends Controller
{
    public function index()
    {
        $users = User::all();
        $collection = collect();

        foreach ($users as $user) {
            $myself = $user->id;
            $partner = $user->partner_id;

            // ... ???
        }

        return $collection->unique();
    }
}

Может ли кто-нибудь мне помочь с решением? Я застрял в моем мозгу.

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

Попробуйте код ниже.

    public function index()
    {
        $usersWithoutPartner = collect();
        $usersWithPartner = collect();
        User::chunk(100, function ($users) use ($usersWithoutPartner, $usersWithPartner) {
            foreach ($users as $user) {
                if ($user->partner_id == null) {
                    $usersWithoutPartner->push($user);
                } else {
                    $usersWithPartner->push($user);
                }
            }
        });

        $finalCollection = collect();
        $finalCollection->push($usersWithoutPartner);
        $finalCollection->push($usersWithPartner);
        return $finalCollection;
}
1 голос
/ 13 марта 2020

Попробуйте, это не идеально, но это может быть место для начала.

// Return all users and group them by their id
$grouped_users = User::all()->groupBy('id');

// Now loop through each user on record
User::all()->each(function ($user) use (&$grouped_users) {
    if ($user->partner_id && $grouped_users->has($user->partner_id)) {
        $partner_id = $user->partner_id;

        // Push the user model into our grouped collection
        $grouped_users[$partner_id]->push($user);

        // Remove the id for the current user from the collection
        $grouped_users->forget($user->id);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...