Laravel - Доступ, манипулирование и циклическое перемещение по сводной таблице - PullRequest
0 голосов
/ 08 октября 2019

У меня есть две таблицы, users и like_categories, которые имеют отношение many-to-many. pivot table называется like_category_user. После вставки данных двух пользователей в db, вот мой pivot table выглядит так: https://i.imgur.com/MeeRbiV.png

Я хочу посчитать amount для каждого из различных, например category для каждого user и сохраните его в object array следующим образом:

[
    {
        "User Id": 1,
        "Like Categories": [
            {
                "Category": "Chinese Restaurant"
                "Amount": 1
            },
            {
                "Category": "Korean Restaurant"
                "Amount": 2
            },
            {
                "Category": "Fast Food Restaurant"
                "Amount": 3
            },
            {
                "Category": "Italian Restaurant"
                "Amount": 1
            },
            {
                "Category": "Steakhouse Restaurant"
                "Amount": 3
            }
        ]
    },
    {
        "User Id": 2,
        "Like Categories": [
            {
                "Category": "Thai Restaurant"
                "Amount": 1
            },
            {
                "Category": "Kebab Shop"
                "Amount": 3
            },
            {
                "Category": "Pizza Place"
                "Amount": 2
            },
            {
                "Category": "Steakhouse"
                "Amount": 1
            }
        }
    }
]

Я попытался сохранить данные из БД в массив объектов на основе вышеуказанного формата. Но вывод не так, как я хотел. Мой код:

public function showUserLikesData() {

        $users = User::all();

        $counter = 0;
        $countUser = 0;
        $countThatCategory = 0;
        $categoryName = '';

        foreach($users as $user) {

            $userLikesData[$countUser]['User Id'] = $user->id;

            foreach ($user->likeCategories as $likeCategory) {

                 $categoryName = $likeCategory->pivot->category_name;

                foreach ($user->likeCategories as $likeCategory) {
                    $checkCategoryName = $likeCategory->pivot->category_name;

                    if ($categoryName == $checkCategoryName) {
                           $countThatCategory++;
                    }
                }

                $userLikesData[$countUser]['Like Categories'][$counter]['Category'] = $categoryName;
                $userLikesData[$countUser]['Like Categories'][$counter]['Amount'] = $countThatCategory;

                $countThatCategory = 0;

                $counter++;
            }
            $countUser++;
            $counter=0;
        }

        return $userLikesData;
    }

object array Я получаю:

[
    {
        "User Id": 1,
        "Like Categories": [
            {
                "Category": "Chinese Restaurant",
                "Amount": 1
            },
            {
                "Category": "Korean Restaurant",
                "Amount": 2
            },
            {
                "Category": "Korean Restaurant",
                "Amount": 2
            },
            {
                "Category": "Fast Food Restaurant",
                "Amount": 3
            },
            {
                "Category": "Fast Food Restaurant",
                "Amount": 3
            },
            {
                "Category": "Fast Food Restaurant",
                "Amount": 3
            },
            {
                "Category": "Italian Restaurant",
                "Amount": 1
            },
            {
                "Category": "Steakhouse",
                "Amount": 3
            },
            {
                "Category": "Steakhouse",
                "Amount": 3
            },
            {
                "Category": "Steakhouse",
                "Amount": 3
            }
        ]
    },
    {
        "User Id": 2,
        "Like Categories": [
            {
                "Category": "Thai Restaurant",
                "Amount": 1
            },
            {
                "Category": "Kebab Shop",
                "Amount": 3
            },
            {
                "Category": "Kebab Shop",
                "Amount": 3
            },
            {
                "Category": "Kebab Shop",
                "Amount": 3
            },
            {
                "Category": "Pizza Place",
                "Amount": 2
            },
            {
                "Category": "Pizza Place",
                "Amount": 2
            },
            {
                "Category": "Steakhouse",
                "Amount": 1
            }
        ]
    }
]

1 Ответ

0 голосов
/ 08 октября 2019

Если вам нужен такой же выход, просто замените этот

$users = User::all();

на

$users = User::all()->toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...