【问题标题】:Laravel 4 eager loading and categories, subcategories, articlesLaravel 4 急切加载和分类、子分类、文章
【发布时间】:2014-01-25 01:19:55
【问题描述】:

您好,我以为我可以自己处理,但实际上我不知道如何咬它。

我正在尝试对我的程序进行分类。将只有 2 个级别的类别:

1 个类别
2 |-子类别

我希望它尽可能简单。
- 程序只能属于一个子类别,
- 类别可以有很多子类别,
- 子类别可以有很多程序,

当然,当有人选择主类别时,我想列出子类别中的所有程序。

我也不确定我当前的数据库表结构和模型中的关系。

数据库中的表:

程序:id、标题、描述、program_subcategory_id
programs_categories:id、名称
programs_subcategories:id、名称、 program_category_id

型号:
Program.php

class Program extends Eloquent {
    protected $table = 'programs';
    public function user()
    {
        return $this->belongsTo('User');
    }
    public function subcategory()
    {
        return $this->belongsTo('ProgramSubcategory', 'program_subcategory_id');
    }   
}

ProgramCategory.php

class ProgramCategory extends Eloquent {
    protected $table = 'programs_categories';
    public function subcategories()
    {
        return $this->hasMany('ProgramSubcategory');
    }
}

ProgramSubcategory.php

class ProgramSubcategory extends Eloquent {
    protected $table = 'programs_subcategories';
    public function programs()
    {
        return $this->hasMany('Program');
    }
    public function category()
    {
        return $this->belongsTo('ProgramCategory');
    }
}

实际控制器:
ProgramsController.php

class ProgramsController extends BaseController {
    public function index()
    {
        $programs = Program::with('subcategory')->orderBy('programs.id', 'desc')->paginate(5);    
        $acategories = ArticleCategory::All();
        $pcategories = ProgramCategory::All();
        return View::make('programs.index', compact('programs', 'acategories', 'pcategories'));
    }
}

ProgramsSubcatecories.php

class ProgramsSubcategories extends BaseController {
    public function index($cname)
    {
        $programs = ProgramSubcategory::whereAlias($cname)->first()->programs()->orderBy('id', 'DESC')->paginate(10);
        $pcategories = ProgramCategory::All();
        $scategories = ProgramSubcategory::All();
        $acategories = ArticleCategory::All();
        return View::make('programs.index', compact('programs', 'pcategories', 'scategories ', 'acategories'));
    }
    public function show($cname, $id)
    {
        $category = ProgramSubcategory::whereAlias($cname)->first();
        $program = $category->programs()->findOrFail($id);
        $pcategories = ProgramCategory::All();
        $acategories = ArticleCategory::All();
        return View::make('programs.show', compact('program', 'category', 'pcategories', 'scategories ', 'acategories'));
    }
}

通过急切加载列出一个类别中的所有项目对我来说不是问题。但我有问题如何处理 2 级类别。

请告知如何启动它。

【问题讨论】:

    标签: php laravel laravel-4 eager-loading


    【解决方案1】:

    您不是在寻找eager loading,您需要解决如何管理数据库中的分层数据。

    嵌套集模型非常适合这个目的。你应该在 Wiki 上阅读一些理论:http://en.wikipedia.org/wiki/Nested_set_model

    幸运的是,Eloquent 已经有了实现。
    提一些:
    - Baum(最好的免费,恕我直言),https://github.com/etrepat/baum
    - Laravel 嵌套集,https://github.com/atrauzzi/laravel-nested-set
    - Laravel4-nestedset,https://github.com/lazychaser/laravel4-nestedset

    和付费的(当然也是最高质量的)
    来自 Cartalyst 公司 - https://cartalyst.com/manual/nested-sets

    【讨论】:

    • 我认为 Baum 会是这里最好的。但它不支持我正在使用的 Laravel 4.1。我真的需要使用嵌套集吗?就没有别的办法了吗?
    • 我只会选择嵌套集——因为这个模型不需要递归来检索树,这意味着它很快,可以在数据库服务器上完成。
    • 我选择了嵌套的lazychaser。如果我错了,请纠正我。对我来说清楚 :) 如果我想使用嵌套集,而不是数据库中的 2 个表(programs_categoriesprograms_subcatecories),我现在只需要使用一个,只是类别。另外,我只需要一个 Category.php 而不是两个模型 Category.phpSubcategory.php。我也有点困惑如何设置我的类别的顺序以使用嵌套集。
    • 是的,你是对的!毕竟,即使是子类别也是类别。它是其父类别的子类别,但其子类别是父类别。此模型可帮助您跟踪此层次结构。
    • 现在一切都清楚了 :) 非常感谢@Andreyco!
    猜你喜欢
    • 2014-08-13
    • 2023-04-03
    • 2021-09-10
    • 2021-09-29
    • 2021-07-12
    • 2015-03-19
    • 2011-05-23
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多