Привет, я думал, что могу справиться с этим сам, но на самом деле я не знаю, как его укусить.
Я пытаюсь классифицировать свои программы. Будет только 2 уровня категорий:
1 КАТЕГОРИЯ
2 | -Субтегория
Я хочу, чтобы это было как можно проще.
– программа может принадлежать только одной подкатегории,
– категории могут иметь много подкатегорий,
– подкатегории могут иметь много программ,
Конечно, я хотел бы перечислить все программы из подкатегорий, когда кто-то выбирает основную категорию.
Я также не уверен в моей текущей структуре таблиц базы данных и отношениях в моделях.
Таблицы в базе данных:
программы : id, title, description, program_subcategory_id
program_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 уровнями категорий.
Пожалуйста, сообщите, как начать работу.
Вы не ищете 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
и платный (конечно же, самое высокое качество)
от компании Cartalyst – https://cartalyst.com/manual/nested-sets