Laravel 4渴望加载和分类,子类别,文章

时间:2014-01-07 11:19:59

标签: php laravel laravel-4 eager-loading

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

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

1类别
2 | -Subcategory

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

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

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

数据库中的表:

程序:id,title,description,program_subcategory_id
programs_categories :id,name
programs_subcategories :id,name,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级别的类别。

请告知如何启动它。

1 个答案:

答案 0 :(得分:1)

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

嵌套集模型可以很好地实现此目的。您应该阅读Wiki上的一些理论:http://en.wikipedia.org/wiki/Nested_set_model

幸运的是,已经有雄辩的实施 提一下:
- 鲍姆(最好的免费,imho),https://github.com/etrepat/baum
- Laravel Nested Set,https://github.com/atrauzzi/laravel-nested-set
- Laravel4-nestedset,https://github.com/lazychaser/laravel4-nestedset

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