Laravel Eloquent многократные отношения - PullRequest
0 голосов
/ 08 июля 2019

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

По сути, у меня есть несколько брендов, которые связаны с сайтом (сайт является веб-сайтом). Сайт может иметь один или несколько брендов, а бренд может иметь одну или несколько категорий. Аналогично, сайт может иметь одну или несколько категорий, и я хочу только категории для бренда, которые также связаны с категориями сайта.

Моя схема базы данных (упрощенная) выглядит следующим образом:

Brand
-----------------
id (int)
name (varchar)
Category
-----------------
id (int)
name (varchar)
Site
-----------------
id (int)
name (varchar)
Brand_Category
-----------------
brand_id (int)
category_id (int)
Brand_Site
-----------------
brand_id (int)
site_id (int)
Category_Site
-----------------
category_id (int)
site_id (int)
slug (varchar)

Я хочу получить следующее:

ПОДАРОК ​​У меня есть site_id КОГДА я запрашиваю множество брендов, связанных с сайтом THEN возвращает массив брендов, содержащий массив категорий, где категории также должны иметь отношение к сайтам

Хотя все вышеперечисленное работает, я не могу также получить значение slug для категории, когда оно отображается на бренде.

Я пробовал различные комбинации типов отношений и думаю, что именно так должны быть сконфигурированы модели Laravel:

Сайт : принадлежит компании Brand_Site

Сайт : принадлежит ToMany Site_Category

Торговая марка : принадлежит компании-бренду_Категория

Бренд : принадлежит компании Brand_Site

Категория : принадлежит ToMany Категория_Site

Категория : принадлежит toMany Brand_Category

Brand_Site : hasMany Brand

Brand_Site hasMany Site

Brand_Category : hasMany Brand

Brand_Category : hasMany Категория

Site_Category : hasMany Site

Site_Category : hasMany Категория

Запрос для брендов, имеющих сайты, кажется, работает нормально:

$brands = BrandSiteMap::where('site_id', $site_id)
    ->where('status', BrandSiteMap::STATUS_ACTIVE)
    ->whereHas('site', function ($query){
        $query->where('status', Brand::STATUS_ACTIVE);
    });

Вот соотношение для brandCategory ниже:

public function brandCategory()
{
    return $this->hasMany(BrandCategoryMap::class, 'brand_id', 'brand_id');
}

И в моей коллекции он работает для получения категорий:

    public function toArray($request)
    {
        $categories = [];
        foreach ($this->brandCategory as $bc) {
            $categories[] = [
                'id' => $bc->category->id,
                'name' => $bc->category->name,
                'slug' => $bc->slug
            ];
        }

        return [
            'id' => $this->brand->id,
            'name' => $this->brand->name,
            'categories' => $categories
        ];
    }

Какие выходы:

[{
    "id": 1,
    "name": "Test brand name",
    "categories": [{
        "id": 1,
        "name": "Test Category",
        "slug": null,
    }]
}]

Выше slug указано null, и я не могу понять, как / где получить эти данные.

EDIT

Возможно, я понял это сам после 48 часов попыток и 15 минут после публикации! Я добавил следующее в BrandSiteMap:

public function categorySite()
{
    return $this->hasOne(CategorySiteMap::class, 'category_id', 'category_id');
}

И тогда я могу ссылаться на слизняка, используя:

'slug' => $bc->categorySite->slug

Это дает мне значение, однако, я обеспокоен тем, что оно будет выбирать только первое (с учетом hasOne), а не правильное (связано с site_id).

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