Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
В MVC нужно всю работу с БД переносить в модели. Но во всех примерах в документации запросы делают в контроллерах.
Так где же на самом деле следует работать с БД?
Не в сети
Не в сети
}
Например?
Возможно где-то для упрощения просто приводят, когда упор на что-то другое
Ну вот за месяц работы с документацией я не нашёл примера, где обращаются с запросом к БД в моделе. И теперь я не могу толком понять как это сделать.
Сначала я так же все запросы писал в контроллерах, но теперь хотел бы разделить работу с БД от контроллеров.
И хотел бы получить совет на таком простом примере:
Раньше у меня был следующий код в контроллере:
DB::table('items')->insert(['name' => $name, 'size' => $size, 'color' => $color] );
Как мне теперь по людски реализовать то же самое, только отдельно в моделе, а в контроллере только вызвав метод с модели?
Неужели так:
контроллер
$item = new Item();
$item->newUser($name, $size, $color);
модель Item
public function newItem($name, $size, $color)
{
DB::table('items')->insert(['name' => $name, 'size' => $size, 'color' => $color] );
}
Изменено laravelNewbie (16.06.2016 13:33:13)
Не в сети
Не в сети
Ну вот так как раз таки в основном и работают с БД в контроллерах.
Например:
App\Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);
Я понимаю, что так удобнее, но мне интересно или разумно производить похожие запросы прямо в моделе? (я пишу диплом и боюсь что ларавельный подход к моделям могут на комиссии не понять)
Не в сети
- Ну вот так как раз таки в основном и работают с БД в контроллерах.
В указанном примере ты не работаешь с БД, ты используешь метод модели.
Редко в реальных приложениях ты обойдешься просто вызовами родных методов актив рекорда. Придется плодить свои по юс-кейсам
Например будет у тебя не просто update а метод setDelay
App\Flight::where(’active’, 1)
—>where(’destination’, ’San Diego’)
—>setDelay($time);
function setDelay($time)
{
$this->>update([’delayed’ ⇒ 1,’delayed_until’=>$time]);
//что-то еще, например бросить событие и тп
}
Не в сети
Но, всё таки, следующий код в контроллере является правильным:
ScheduleRelation::insert(['s_id' => $id, 'u_id' => $user->id]);
Schedule::where('id', '=', $id)->decrement('slots');
?
Не в сети
Отвечу исходя из личного опыта. Бизнес-логика связанная с конкретной моделью должна содержаться в её классе, в виде методов, для максимального упрощения работы с данной моделью в контроллерах. Но всю бизнес-логику приложения не следует пытаться вынести в модель.
А контроллер, по сути, отвечает за вызов и координацию методов моделей в зависимости от переданных параметров. Главное не делать его слишком жирным.
Советую в сторону ОРМ посмотреть то бишь Eloquent
чтобы можно было сделать так
https://laravel.com/docs/5.2/eloquent#mass-assignment
Согласен с этим.
Но, всё таки, следующий код в контроллере является правильным:
ScheduleRelation::insert(['s_id' => $id, 'u_id' => $user->id]); Schedule::where('id', '=', $id)->decrement('slots');
?
Лучше сделать с помощью ORM, будет примерно следующее:
Model::create(['s_id' => $id, 'u_id' => $user->id]);
$model->getByLastSlot();
Не в сети
Страницы 1