Один и тот же контроллер Laravel для разных типов пользователей

У меня есть два типа пользователей: учитель и ученик

Для школьников маршрут следующий:

GET /me/books

студенты должны иметь только свои книги в ответ.

Маршрут для учителей:

GET /books

и учителя должны иметь все учебники учеников в ответ.

У меня есть одна модель: Book и один контроллер: BookController. Как лучше всего написать метод BookController@index в этой ситуации? Использование переключателя для пользовательских типов внутри метода индекса не похоже на лучшую практику.


person Egemenk    schedule 25.12.2020    source источник
comment
Мое личное мнение таково, что время/пространство, которое вы экономите, обрабатывая два ресурса с одним и тем же контроллером, не стоит головной боли при отладке. Я выбираю более чистый и простой для отладки подход, создавая два разных BookController в разных пространствах имен.   -  person bassxzero    schedule 25.12.2020
comment
поделитесь кодом индексного метода.   -  person Jasim Juwel    schedule 25.12.2020


Ответы (2)


Вы даже можете оставить маршрут прежним. Просто используйте роли для учителей и учеников.

Если вы не хотите реализовывать роли, вы можете просто иметь столбец в таблице пользователей для типа, например, учителя или ученика.

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

public function index()
{
    $user = auth()->user();
    $query = Book::query();

    if($user->type === 'student') {
        $query->where(/*some condition to constrain the records*/);

        //Or if you have a relation to fetch books for the user
        $query = User::query()->with('books');

    }

    $books = $query->get();

    //return json response for ajax request or a view
}
person Donkarnash    schedule 25.12.2020

Привет, друг. Вы можете установить отношение пользователя или запрос, как показано ниже.

public function getStudentBook() //get the student book
{
    $user = auth()->user();
   
    if($user->role == 'student') { //assuming role column has student or teacher value
       
      //assuming user_books as pivot table for users and book table
      $books = Book::join('user_books', 'user_books.student_id', '=', 'users.id')
            ->where('user_books.student_id', '=', $user->id)
            ->groupBy(user_books.book_id)
            ->get();
 
    }

}

public function getStudenstBook() //get the students book of teacher
{
    $user = auth()->user();
   
    if($user->role == 'teacher') { //assuming role column has student or teacher value
      
      //assuming student_teacher table as as pivot table for teacher student table
      $student_ids = DB::table('student_teacher')->where('teacher_id' , '=', $user->id)
                     ->grouBy('student_teacher.student_ids')->pluck('student_ids')->toArray();

      //assuming user_books as pivot table for users and book table
      $books = Book::join('user_books', 'user_books.student_id', '=', 'users.id')
            ->whereIn('user_books.student_id',  $student_ids)
            ->groupBy(user_books.book_id)
            ->get();
 
    }

}

Если есть сомнения, не стесняйтесь оставлять комментарии. Спасибо, хорошего дня

person Abdul Hakeem    schedule 25.12.2020