Несколько таблиц в одной модели – Laravel

Страница «Мой индекс» использует 3 таблицы в базе данных:

  • index_slider
  • index_feature
  • footer_boxes

Я использую один контроллер (IndexController.php) и вызываю три модели:

public function index() { return View::make('index') ->with('index_slider', IndexSlider::all()) ->with('index_feature', IndexFeature::all()) ->with('footer_boxes', FooterBoxes::all()); } 

Для трех моделей выше нужны :: all () данные, поэтому они все настроены следующим образом:

 class IndexSlider extends Eloquent { public $table ='index_slider'; } 

примечание: изменения имени класса для каждой модели

Видя, как моя индексная страница требует этих 3 таблиц, и факт, что я повторяю синтаксис в каждой модели, должен ли я использовать полиморфные отношения или устанавливать это по-другому? ORM из того, что я прочитал, должен иметь 1 модель для каждой таблицы, но я не могу не чувствовать, что это будет глупо в моей ситуации и многих других. СУХОЙ (не повторяй себя) в некотором смысле теряет смысл.

Какой был бы лучший подход к этому, или я на правильном пути?

Во-первых, я должен сказать, что каждая модель написана для конкретной таблицы, вы не можете сжать три таблицы в одну модель, если они не связаны. Глянь сюда

Есть два пути, по которым я буду делать код более СУХОЙ. Вместо того, чтобы передавать ваши данные в цепочке с помощью, я передал бы это как второй параметр в вашем make:

 public function index() { $data = array( 'index_slider' => IndexSlider::all(), 'index_feature' => IndexFeature::all(), 'footer_boxes' => FooterBoxes::all(), ); return View::make('index', $data); } 

Передача данных в качестве второго параметра. Глянь сюда

Другим способом я бы это сделал, и это лучшее решение, если ваше приложение будет расти, – это создать службу (другой класс модели, но не подключен к красноречивому), который при вызове вернет необходимые данные. Я определенно сделаю это таким образом, если вы вернете вышеуказанные данные в несколько представлений.

Пример использования службы будет выглядеть примерно так:

 <?php // app/models/services/indexService.php namespace Services; use IndexSlider; use IndexFeature; use FooterBoxes; class IndexService { public function indexData() { $data = array( 'index_slider' => IndexSlider::all(), 'index_feature' => IndexFeature::all(), 'footer_boxes' => FooterBoxes::all(), ); return $data; } } 

и ваш контроллер:

 <?php // app/controllers/IndexController.php use Services/IndexService; class IndexController extends BaseController { public function index() { return View::make('index', with(new IndexService())->indexData()); } } 

Эта услуга может быть расширена с помощью гораздо менее специфических методов, и вы должны обязательно изменить именование (от IndexService и indexData до более конкретных имен классов / методов).

Если вы хотите получить дополнительную информацию об использовании Сервисов, я написал здесь крутую статью об этом

Надеюсь это поможет!