Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 16.06.2016 13:18:27

Где нужно обращаться с запросом к БД?

В MVC  нужно всю работу с БД переносить в модели. Но во всех примерах в документации запросы делают в контроллерах.
Так где же на самом деле следует работать с БД?

Не в сети

#2 16.06.2016 13:20:03

Re: Где нужно обращаться с запросом к БД?

  1. Но во всех примерах в документации запросы делают в контроллерах.

Например?
Возможно где-то для упрощения просто приводят, когда упор на что-то другое

Не в сети

#3 16.06.2016 13:28:54

Re: Где нужно обращаться с запросом к БД?

VitalN пишет:

}
Например?
Возможно где-то для упрощения просто приводят, когда упор на что-то другое


Ну вот за месяц работы с документацией я не нашёл примера, где обращаются с запросом к БД в моделе. И теперь я не могу толком понять как это сделать.
Сначала я так же все запросы писал в контроллерах, но теперь хотел бы разделить работу с БД от контроллеров.
И хотел бы получить совет на таком простом примере:
Раньше у меня был следующий код в контроллере:

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)

Не в сети

#4 16.06.2016 13:39:57

Re: Где нужно обращаться с запросом к БД?

Советую в сторону ОРМ посмотреть то бишь Eloquent
чтобы можно было сделать так
https://laravel.com/docs/5.2/eloquent#mass-assignment

Не в сети

#5 16.06.2016 16:17:21

Re: Где нужно обращаться с запросом к БД?

Ну вот так как раз таки в основном и работают с БД в контроллерах.
Например:

App\Flight::where('active', 1)
          ->where('destination', 'San Diego')
          ->update(['delayed' => 1]);

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

Не в сети

#6 16.06.2016 16:45:16

Re: Где нужно обращаться с запросом к БД?

  1. Ну вот так как раз таки в основном и работают с БД в контроллерах.

В указанном примере ты не работаешь с БД, ты используешь метод модели.

Редко в реальных приложениях ты обойдешься просто вызовами родных методов актив рекорда. Придется плодить свои по юс-кейсам

Например будет у тебя не просто update а метод setDelay
App\Flight::where(’active’, 1)
—>where(’destination’, ’San Diego’)
—>setDelay($time);


function setDelay($time)
{
$this->>update([’delayed’ ⇒ 1,’delayed_until’=>$time]);
//что-то еще, например бросить событие и тп
}

Не в сети

#7 18.06.2016 12:23:34

Re: Где нужно обращаться с запросом к БД?

Но, всё таки, следующий код в контроллере является правильным:

ScheduleRelation::insert(['s_id' => $id, 'u_id' => $user->id]);

Schedule::where('id', '=', $id)->decrement('slots');

?

Не в сети

#8 19.06.2016 06:40:05

Re: Где нужно обращаться с запросом к БД?

Отвечу исходя из личного опыта. Бизнес-логика связанная с конкретной моделью должна содержаться в её классе, в виде методов, для максимального упрощения работы с данной моделью в контроллерах. Но всю бизнес-логику приложения не следует пытаться вынести в модель.
А контроллер, по сути, отвечает за вызов и координацию методов моделей в зависимости от переданных параметров. Главное не делать его слишком жирным.

VitalN пишет:

Советую в сторону ОРМ посмотреть то бишь Eloquent
чтобы можно было сделать так
https://laravel.com/docs/5.2/eloquent#mass-assignment

Согласен с этим.

laravelNewbie пишет:

Но, всё таки, следующий код в контроллере является правильным:

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();

Не в сети

Подвал раздела