Я использую eloquent со Slim Framework, но, похоже, застрял в проблеме, связанной с многоуровневой энергичной загрузкой с необязательным предложением where. Сначала немного о проблеме.
Существует 3 таблицы Category, Sub_category и Child_category.
Таблица sub_category содержит столбец 'category_id', который является внешним ключом к 'id' таблицы категорий.
Таблица child_category содержит столбец 'sub_category_id', который является внешним ключом для 'id' таблицы sub_category
Мне удалось получить все данные из таблиц в соответствии с иерархией со следующим
$categoryHierarchy = Category::with([
'subCategories' => function ($query) {
$query->select('id', 'category_id', 'name');
},
'subCategories.childCategories' => function ($query) {
$query->select('id', 'sub_category_id', 'name');
}
])
->select('id', 'name', DB::raw('CONCAT("'.$_SERVER['SERVER_NAME'].'/",carousel_image) AS image'))->get();
Теперь, как часть API, мне нужно получить все / частичные данные из этой иерархии
т.е. если указан category_id, мне нужно указать только иерархию этой категории.
Если указан идентификатор подкатегории (вместе с идентификатором категории), то будет предоставлена только соответствующая категория, подкатегория и все ее дочерние категории
Аналогично, API может также отфильтровывать дочернюю категорию (вместе с категорией и подкатегорией)
Я пытался сделать это «где», но он вернул пустой набор данных.
Любая помощь очень ценится.
UPDATE
Часть whereHas выглядела примерно так, как показано ниже. Но, как ни странно, у меня сейчас нет этого кода с собой, и хотя он не проверен, он был очень близок к реализации.
$categoryHierarchyQuery = Category::with([
'subCategories' => function ($query) {
$query->select('id', 'category_id', 'name');
},
'subCategories.childCategories' => function ($query) {
$query->select('id', 'sub_category_id', 'name');
}
])
->whereHas(['subCategories' => function ($query) use ($subcategoryId) {
if($subcategoryId != null)
$query->where('id', $subcategoryId);
},
'subCategories.childCategories' => function ($query) use($childCategoryId) {
if($childCategoryId != null)
$query->where('id', $childCategoryId);
}])
->select('id', 'name', DB::raw('CONCAT("'.$_SERVER['SERVER_NAME'].'/",carousel_image) AS image'))->get();
if($categoryHierarchyQuery != null)
{
$categoryHierarchyQuery->where('id', $categoryId);
}
$categoryHierarchy = $categoryHierarchyQuery->get();