2014-01-07 69 views
0

嗨,我想我可以自己處理這個,但實際上我不知道如何咬它。Laravel 4渴望加載和類別,子類別,文章

我想分類我的程序。將只有2級類別:

1類
2 | -Subcategory

我希望它是儘可能簡單。
- 程序只能屬於一個子類別,
- 類別可以有很多小類,
- 子類別可以有很多方案,

我當然想列出從子類別中的程序,當有人選擇主要類別。

我也不確定我當前的數據庫表結構和模型中的關係。

表在數據庫:

程序: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級分類做到這一點。

請指教如何啓動它。

回答

1

您並不想要eager loading,您需要解決如何管理數據庫中的分層數據。

嵌套模型很好地服務於此目的。您應該閱讀Wiki的一些理論:http://en.wikipedia.org/wiki/Nested_set_model

幸運的是,已經有Eloquent實現。
提一些:
- 鮑姆(最好的免費,恕我直言),https://github.com/etrepat/baum
- Laravel嵌套集合,https://github.com/atrauzzi/laravel-nested-set
- Laravel4-nestedset,https://github.com/lazychaser/laravel4-nestedset

和支付一個(當然最高質量爲好)
from Cartalyst company - https://cartalyst.com/manual/nested-sets

+0

我看到Baum會是這裏最棒的。但它不支持我正在使用的Laravel 4.1。我真的需要使用嵌套集嗎?沒有其他方法嗎? – SONGE

+0

我只想去嵌套集合 - 因爲這個模型不需要遞歸來檢索樹,它意味着它很快,可以在數據庫服務器上完成。 – Andreyco

+1

我選擇了lazychaser的嵌套集。如果我錯了,請糾正我。只是爲了讓我清楚:)如果我想使用嵌套集合,我的數據庫(** programs_categories **和** programs_subcatecories **)中的2個表的intead,我只需要使用一個,只需**類別** 。此外,而不是兩個模型** Category.php **和** Subcategory.php **我只需要一個** Category.php **。另外我有點困惑如何設置我的類別的順序使用嵌套集。 – SONGE