Если данные на странице Laravel выводятся из многих таблиц — принято ли делать много моделей и пихать их в один контроллер?
Здравствуйте.
Решил переделать форму ввода одного проекта на основе Laravel (-:
Суть вопроса вот в чем:
- Форма имеет кучу выпадающих списков и заказчик хочет, чтобы они формировались из базы (чтобы он управляя базой, мог влиять непосредственно на содержание формы).
Соответственно, под каждый список - нужно таблицу.
А под каждую таблицу - модель Laravel.
И как это потом выводить? В одном контроллере обратиться ко всем этим моделям или что?
Alex Wells, можно конечно и в одну таблицу, и в отдельном поле прописать к чему относится запись, но с т.з. принципов организации БД - это ересь))
Хотя обсужу с заказчиком и такой вариант, почему бы и нет.
Можно кстати сделать еще таблицу с названиями списков и отношение многие-ко-многим. Тоже как вариант. Но я вчера с ним здорово намучился пытаясь реализовать всё через Eloquent, не уверен что хочу повторения -)
Под каждую таблицу своя модель.
Например Auto к таблице autos
В контроллере в самом верху use App\Models\Auto;
И все нужные модели.
В самом методе контроллера $autos = Auto::all();
И так для всех нужных моделей в форме
И передаем переменные в шаблон blade return view('form', compact('autos', 'velos'));
А там уже через foreach перебираем в списках
Кстати, уже не в первый раз встречаю конструкцию compact() в данном контексте, смотрел в PHP-доках... но так и не понял, в чем смысл ее использования в данном случае. Ведь
$autos = Auto::all();
$autos - это в данном случае коллекция, так? А с ней, как я понял, и так можно работать как с массивом. Или я что-то недопонял?
смотрел в PHP-доках... но так и не понял, в чем смысл ее использования в данном случае.
Я не смотрел php доки насчет compact, но в Laravel так передаю переменные в blade шаблоны. По-моему ларавель так рекомендует в своих доках
$autos - это в данном случае коллекция, так? А с ней, как я понял, и так можно работать как с массивом.
Да, это коллекция. Коллекция это как массив. Но только коллекция)) Я сильно не вникал в теорию. Можно также собирать коллекции после запроса через get()
лучший способ узнать что и как выглядит( чтобы например понять, как достать то, что нужно) dd($autos);
внутри метода контроллера. При вызове метода распечатается коллекция со всеми свойствами.
я первое время дедешил постоянно
jazzus, дадада, я это тоже видел уже неоднократно, но так и не понял:
лучший способ узнать что и как выглядит( чтобы например понять, как достать то, что нужно)
dd($autos);
внутри метода контроллера. При вызове метода распечатается коллекция со всеми свойствами.
я первое время дедешил постоянно
я пишу это в контроллер, а оно мне потом по вьюху выведет, или чего дальше-то? надо ли как-то к вьюхе прикреплять?
очень не хватает возможности легкого вывода переменных, я во вьюхе сейчас делаю так:
jazzus @jazzus
procode, ну да в самом методе контроллера. внутри
public function index(){
dd($autos);
}
щас попробовал - оч крутая штука!!! выводит кучу переменных, да еще и в отформатированном виде!! дебажить приложение - самое то! еще раз спасибище!!)))
procode, я с помощью dd в принципе понял суть всех процессов. Как там что устроено. А то написано в доках массив. И что это? Для кого и зачем. Или отношения. А оказывается сами отношения тоже можно задедешить. И это будет отдельный объект. Поэтому самый главный совет – не смотри документацию. На начальных этапах это вредно. Потом интересно читать – да, а так спрашивай сразу здесь (мне здесь реально помогли разобраться в куче важных вопросов). Ну или dd)
procode, а почему ты хочешь именно на каждый список таблицу делать? Крутой вариант, как ларавель советует – т.е. под каждую таблицу своя модель. А модель - это сущность. Auto, brand, dealer, user – отдельные таблицы и модели. Это максимально удобно и круто. Связать потом все и вертеть как хочешь с любой модели к любой модели. В auto добавить поля dealer_id, brand_id, user_id. Cвязать их в самой таблице (прописать к ним foreign в миграциях) и отношениями в моделях. И потом писать человекопонятные схемы. $auto->user->first(); или $dealer->autos()->get(); Т.е. программирование превращается в игру. Также несколько выпадающих списокв могут брать данные из одной таблицы. Я думаю здесь не от списка нужно отталкиваться. Например машины по цвету, году, цене дотсупности сортировать - это все могут быть отедльные списки одной таблицы. Хотя ты может другое имел ввиду, а то я сейчас насоветую))