Я довольно новичок в 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).