获取类别和所有子类别中的所有页面 [英] Get all pages from Category and all sub categories

查看:56
本文介绍了获取类别和所有子类别中的所有页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从类别和所有子类别中获取所有页面.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆