Использование Laravel / Eloquent для создания списка элементов, сгруппированных по столбцу связанной модели - PullRequest
0 голосов
/ 11 мая 2018

У меня есть таблица с именем знаменитости , которая имеет отношение «многие ко многим» с тремя другими таблицами: коллекции , категории и теги.В настоящее время у меня настроен API, чтобы он возвращал следующее:

[
    {
        "id": 1,
        "display_name": "Joe Shmo",
        "born": "1917-05-11",
        "died": null,
        "biography": "Some guy in a well-known TV show.",
        "collections": [
            {
                "id": 1,
                "name": "Featured Celebrity"
            }
        ],
        "categories": [
            {
                "id": 1,
                "name": "Movies/TV"
            }
        ],
        "tags": []
    },
    {
        "id": 2,
        "display_name": "Jane Doe",
        "born": "1914-05-11",
        "died": "1993-10-30",
        "biography": "She was famous for a show in the 80's.",
        "collections": [
            {
                "id": 2,
                "name": "Top Ten Celebrities"
            }
        ],
        "categories": [
            {
                "id": 1,
                "name": "Movies/TV"
            }
        ],
        "tags": []
    },
...

Я хотел бы вернуть JSON, сгруппированный по значению name из collection .Вот пример того, что я хочу:

[
    {
        "Feature Celebrity": [
            {
                "id": 1,
                "display_name": "Joe Shmo",
                "born": "1917-05-11",
                "died": null,
                "biography": "Some guy in a well-known TV show.",
                "categories": [
                    {
                        "id": 1,
                        "name": "Movies/TV"
                    }
                ],
                "tags": []
            }
        ]
    },
    {
        "Top Ten Celebrities": [
            {
                "id": 2,
                "display_name": "Jane Doe",
                "born": "1993-05-11",
                "died": null,
                "biography": "A famouse beach volley ball person.",
                "categories": [
                    {
                        "id": 2,
                        "name": "Sports"
                    }
                ],
                "tags": []
            },
            ...
        ]
    }
]

Что касается моего кода Laravel, вот что я настроил.

Знаменитость (модель)

namespace App;

use Illuminate\Database\Eloquent\Model;

class Celebrity extends Model
{
    protected $hidden = ['pivot'];

    public function categories()
    {
        return $this->belongsToMany('App\Category');
    }

    public function collections()
    {
        return $this->belongsToMany('App\Collection');
    }

    public function tags()
    {
        return $this->belongsToMany('App\Tag');
    }
}

Коллекция (модель)

namespace App;

use Illuminate\Database\Eloquent\Model;

class Collection extends Model
{
    protected $hidden = ['pivot'];

    public function celebrities()
    {
        return $this->belongsToMany('App\Celebrity');
    }
}

Категория (модель)

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $hidden = ['pivot'];
}

Метка (модель)

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    protected $hidden = ['pivot'];
}

В моем CelebrityController у меня есть следующий код, который возвращает JSON в формате, подобном показанному в первом примере:

public function list($born = null) {
        if (!isset($born)) {
            $born = date('m-d');
        }

        return Celebrity::with([
            'collections:id,name',
            'categories:id,name',
            'tags:id,name',
        ])
            ->where('born', 'like', '%-' . $born . '%')
            ->get([
                'id',
                'display_name',
                'born',
                'died',
                'biography',
            ]);
    }

ЗдесьЭто изображение моих таблиц и их отношений: Таблицы знаменитостей

Я очень новичок в Laravel и Eloquent.Я не могу понять, как перейти от первого примера JSON ко второму.Любая помощь будет оценена.

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