https://laravel.com/docs/9.x/eloquent https://laravel.com/docs/9.x/authorization#gates
Yeah, what it seems to me here is that you should learn Eloquent, and maybe learn gates as well. Things will make more sense when you understand these concepts.
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
I'm building a project for a centre of courses. There are multiple branches of the centre + roles and permissions. So each admission belongs to a branch and each user within a branch can only see related admissions if he has the permissions or sees all the admissions if he is a super admin or has the permission to.
There are 4 different admissions with a common table admissions. Each admission has its own other tables and the same functions like view, edit, delete, pdf ..etc.
admissions:
id | name | type_id | branch_id
type_one_related_1:
id | column1 | column2
type_one_related_2:
id | column1 | column2
..etc.
I have different options to achieve that: 1- Create one controller for all:
class Admission extends Controller
{
public function index(Request $request, $admissionType){
switch($admissionType){
case 1:
if($request->user()->cannot('viewTypeOne', Admission::class)){
return redirect()->route('home');
}
$admission = Admission::where('type_id', $admissionType)->with('type_one');
break;
case 2:
..
}
}
public function edit(AdmissionEditRequest $request, Admission $admission){
switch($admission->type_id){
case 1:
if($request->user()->cannot('editTypeOne', $admission){
return redirect()->route('home');
}
$admission->load('type_one');
}
}
public function pdf(Request $request, Admission $admission){
switch($admission->type_id){
case 1:
if($request->user()->cannot('viewTypeOne', $admission){
return redirect()->route('home');
}
$admission->load('type_one');
}
}
}
2- Separate each time with its own controller: TypeOneController:
class TypeOneController extends Controller
{
public function index(Request $request, TypeOne $typeOne){
if($request->user()->cannot('viewTypeOne', $typeOne)){
return redirect()->route('home');
}
}
..
}
TypeTwoController:
class TypeTwoController extends Controller
{
public function index(Request $request, TypeTwo $typeTwo){
if($request->user()->cannot('viewTypeTwo', $typeTwo)){
return redirect()->route('home');
}
}
..
}
3- Create a base controller for admissions + separate controllers:
class BaseAdmission extends Controller
{
public $view;
public $model;
public $table;
public $join;
public function index(Request $request){
if($request->user()->cannot($this->view, $this->model)){
return redirect()->route('home');
}
$modelData = DB::table($this->table )
->join($this->join)
->get();
}
}
class TypeOneController extends BaseAdmission
{
public function __construct(){
$this->view = 'viewTypeOne';
$this->model = TypeOne::class;
$this->table = 'admissions';
$this->join = 'type_one_related_data';
}
}
Which case would be better?
Is there a better method?
Please or to participate in this conversation.