Страница «Мой индекс» использует 3 таблицы в базе данных:
Я использую один контроллер (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 до более конкретных имен классов / методов).
Если вы хотите получить дополнительную информацию об использовании Сервисов, я написал здесь крутую статью об этом
Надеюсь это поможет!