我正在使用简洁的框架,但我似乎陷入了涉及使用可选的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,我需要单独提供该类别的层次结构。
如果提供了子类别ID(以及类别ID),则只提供相关类别,子类别及其所有子类别
同样,api也可以过滤掉子类别(以及category和sub_category)
我已经尝试过这样做' whereHas'但它返回了一个空的数据集。
非常感谢任何帮助。
更新
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();