Несколько моделей из одного контроллера

Я новичок в Laravel и немного ржавый в целом, так что терпите меня. Мне интересно, что лучший способ сделать это.

У меня есть несколько таблиц и несколько MySQL представлений. Каждая таблица или представление имеет свою собственную модель (это верно?).

Таблицы: пользователь , отдел , сайт , время пользователя

Представления: FullUser (присоединяется к пользователю , отделу и сайту ), UserTime (присоединяется к пользователю , UserTime ), UserDateOnly (присоединяется к пользователю , UserTime и группируется по дате / пользователю)

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

Во-первых, я должен добавить этот метод в пользовательский контроллер или создать отдельный контроллер для этого, так как он будет запрашивать несколько моделей?

Во-вторых, мой план для процесса:

  1. Получить список всех соответствующих сотрудников для руководителя от FullUser .
  2. Просмотрите все результаты и запросите представление UserDateOnly для каждого, чтобы получить все даты для этого пользователя.
  3. Переберите результаты и запросите представление UserTime для каждой даты, чтобы получить все время для этой даты для этого пользователя.
  4. Добавьте результаты в коллекцию в этом макете, чтобы перейти к представлению:

Сотрудники []

---- Employee-> empoyee_details

-------- Дата []

------------ Times-> Время

Это кажется разумным, и я должен делать все это в одном методе контроля. Я не могу придумать другой способ сделать это без выполнения запросов из представления.

Благодарю.

Всего 1 ответ


Контроллер - это просто файлы для лучшего чистого кода, но они на самом деле не привязаны к модели, вы можете иметь UserController, но выбросить туда все, что вы хотите, и получить любую модель, которую вы хотите оттуда:

class UserController {

   public function getPhotos(Request $request, Photo $photo){
       return $photo;
   }

}

Ваш вопрос больше касается запросов к базе данных, что можно сделать с помощью моделей (Eloquent), например, если вы хотите получить пользователя типа супервизоров, при условии, что у вас есть это в виде столбца в вашей таблице

User::where('is_supervisor', 1)->get() // Get all;
User::where('is_supervisor', 1)->first() // get the first result row in db

Теперь, если вы хотите сделать его более сложным и хотите вступить в красноречивые отношения , тогда вам нужно прочитать совершенно новую тему.

Например, вы можете назначить отделы для пользователей, и наоборот, так

Подготовьте миграции (таблицы базы данных)

Для файла миграции пользователей

Здесь вам нужно добавить столбец с именем department_id , если пользователь принадлежит к одному отделу.


    // appending to users migrations 
    ....
    $schema->unsignedBigInteger('department_id')->nullable();
    ....

Затем в модели Users.php вам нужно добавить это

....
public function department(){
   return $this->belongsTo('AppDepartment'); // or $this->belongsTo(Deparment::class); if you want to put use `AppDeparments` in the head of your php model file
}

Затем вы можете получить объект отдела из объекта пользователя, например, в контроллере, если хотите:

$User = User::first()->department;

Приведенный выше код будет пытаться выбрать строку отдела из таблицы отделов в вашей базе данных на основе значения в идентификаторе отдела выбранного пользователя, поэтому, если у вас есть пользователь с идентификатором 1 и отдел_ид 2, и вы говорите Laravel, чтобы получить объект пользователя с идентификатором 1, затем перейдите к отношению ->department , он извлечет его на основе указанного идентификатора, и для этого он возвратит объект депонирования с идентификатором 2, после чего вы сможете получить доступ к данным этого объекта отдела, как вы можете сделать: User::first()->department->title , который получит столбец заголовка из отделов.

Это длинная тема с большим количеством возможностей, я бы посоветовал вам прочитать Laravel Relations для этого.

Ваш лучший друг здесь и всегда будет помощником dd , когда вы сомневаетесь в выводе вашего кода, просто dd() это нравится так, если вы хотите увидеть, что у этого User::first()->department есть, вы можете dd(User::first()->department); и посмотреть данные, когда сомневаешься.


Есть идеи?

10000