获取类别和所有子类别中的所有页面 [英] Get all pages from Category and all sub categories
本文介绍了获取类别和所有子类别中的所有页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试从类别和所有子类别中获取所有页面.
I'm trying to get all pages from category and all sub categories.
我当前的类别"表结构("category_parent"中的父类别为NULL):
My current "Categories" table structure (NULL for parent category in "category_parent"):
id | category_name | category_parent
页面"表结构:
id | page_name
"PageRelations"表结构:
"PageRelations" table structure:
id | page_id | category_id
PageRelations模型:
PageRelations model:
<?php
namespace App\Http\Models;
use Illuminate\Database\Eloquent\Model;
class PageRelations extends Model
{
public function categoryPages()
{
return $this->hasMany('App\Http\Models\Pages', 'id', 'page_id');
}
public function page()
{
return $this->hasOne('App\Http\Models\Pages', 'id', 'page_id');
}
}
例如,如果结构为:
+Cat1
Page1
Page2
+Cat2
Page3
+Cat3
Page4
Page5
+Cat4
Page6
Page7
当我单击"Cat1"时,它返回:page1,page2,page3,page4,page5.
When I click on "Cat1" it returns: page1, page2, page3, page4, page5.
如何从类别和所有子类别中获取所有页面?
How to get all pages from category and all sub categories?
推荐答案
控制器
<?php
namespace App\Http\Controllers;
use App\Models\Category;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
/**
* @var Category
*/
protected $category;
/**
* @var \Illuminate\Database\Eloquent\Builder
*/
protected $query;
/**
* Controller constructor.
* @param Category $category
*/
public function __construct(Category $category)
{
$this->category = $category;
$this->query = $this->category->newQuery();
}
public function home()
{
print_r($this->getAncestorCategoriesE1(2, 3)->toArray());
print_r($this->getSubCategoriesE2(null, 7)->toArray());
print_r($this->getSubCategoriesE2(1, 7)->toArray());
print_r($this->getSubCategoriesE1(null, 8)->toArray());
print_r($this->getSubCategoriesE1(1, 8)->toArray());
}
/**
* Easy method but select all
*
* @param $categoryId
* @param int $depth
* @return \Illuminate\Database\Eloquent\Collection|string|static[]
*/
public function getAncestorCategoriesE1($categoryId, $depth = 1)
{
if (!is_numeric($depth) || $depth < 1) {
return 'INvalid depth parameter';
}
$parents = [];
for ($i = 0; $i < $depth; $i++) {
$parents[] = 'parent';
}
$rel = implode('.', $parents);
return $this->category->with($rel)->find($categoryId);
}
/**
* Easy method but select all
*
* @param null $categoryId
* @param int $depth
* @return \Illuminate\Database\Eloquent\Collection|string|static[]
*/
public function getSubCategoriesE1($categoryId = null, $depth = 1) {
if (!is_numeric($depth) || $depth < 1) {
return 'INvalid depth parameter';
}
$children = [];
for ($i = 0; $i < $depth; $i++) {
$children[] = 'children';
}
$rel = implode('.', $children);
$this->addCategoryCondition($categoryId);
return $this->category->with($rel)->get();
}
/**
* @param null $categoryId
* @param int $depth
* @return \Illuminate\Database\Eloquent\Collection|static[]
*/
public function getSubCategoriesE2($categoryId = null, $depth = 4)
{
$this->addCategoryCondition($categoryId);
$this->pushSelectInQuery($this->query);
$this->pushWithInQuery($this->query, $depth);
return $this->query->get();
}
/**
* @param $query
*/
public function pushSelectInQuery($query)
{
$query->select('name', 'id', 'parent_id');
}
/**
* @param $query
* @param int $depth
*/
public function pushWithInQuery($query, $depth = 1)
{
$query->with(['children' => function($query) use ($depth) {
$this->pushSelectInQuery($query);
if (1 != $depth) {
$this->pushWithInQuery($query, --$depth);
}
}]);
}
/**
* @param $categoryId
*/
public function addCategoryCondition($categoryId)
{
if (is_null($categoryId)) {
$this->query->whereNull('parent_id');
} else {
$this->query->where('parent_id', $categoryId);
}
}
}
型号
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'parent_id', 'name'
];
/**
*
*/
public function children()
{
return $this->hasMany(Category::class, 'parent_id', 'id');
}
/**
*
*/
public function parent()
{
return $this->belongsTo(Category::class, 'parent_id', 'id');
}
}
在控制器中已干燥,稍后再修复!!!请参阅此解决方案在父类别中获取子类别信息在laravel中
In controller has DRY I fix it later!!! see this solution Getting sub category info in parent category in laravel
这篇关于获取类别和所有子类别中的所有页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文