Building a Scheduling App in Laravel 9 - part 1

Join this mini series following the build of a small project in Laravel. This project will deal scheduling of short courses!.

Sometimes you get the itch to build more than just a website - the skills you gain from this help in your web building by being able to add more complex functionality to websites, or by branching out into building full scale applications.

The motivation for building this app came from a problem at work. We needed to schedule some short course bootcamps, but different levels of users needed different levels of functionality. For example, our learners only needed to be able to see the schedule, whereas our trainers needed to be able to sign up their name to a session.

We had tried various tools, starting with Airtable, Google Sheets and Monday.com. All of these tools did different things well, but this simple scheduling issue could end up impacting other areas of the business, so the ability to enable us to extend the system was key.

I decided to use Laravel to build the application. I had used it briefly in a project before and was keen to dive further into it. I wanted to use Vue to build the frontend, however upon research, I felt to get to MVP level I felt like using the blade templating engine provided by Laravel would allow me to get my application up quicker. On the roadmap would be the conversion of the app to using Vue as a frontend and a Laravel API backend. Finishing the tech stack would be a MYSQL database and Tailwind for CSS. Vite would be the build tool as the new default option for Laravel.

User Stories

For the first iteration of the project, I am assuming just two types of user, an admin (me) and the trainers. The following user stories apply for this iteration.

As an admin, I need to see all pages in the application for manage all the components

As an admin I need to be able to add, edit and delete trainers, courses, cohorts and sessions.

As an admin I need to be able to create multiple instances of the same course, with a different cohort each time. This is so I can schedule different instances of the course and their sessions on different dates.

As a trainer I need to be able to see all the sessions from the courses I teach on, so that if I get a query from a learner I can answer that query.

As a trainer I need a dashboard to give me details of my upcoming sessions.

As a trainer I need a google calendar invite with the session name, cohort name and date and time of the session.

I would make more user stories in the future for different features of the application. I have included a roadmap and the bottom of this article. As I add articles in this series I will link up the roadmap to the new features.

Setting up a Laravel App

I have had a few false starts before with building applications, so Laravel was already installed globally on my computer. So I opened my code editor (VSCode) and opened a new terminal, creating a new directory using the mkdir command, and installing Laravel in there using the Laravel new command. Below is an example of the structure of the app when installed (a different application image was use, but you get the idea!)

Setting up the Database

This proved to be particularly difficult when it really shouldn't have been... Using MySQL on a chromebook isn't ideal anyway, but is essentially just using it in a linux container, so no excuses. But i did lose my password from the previous time I'd done this, and found it a real struggle to change it. Once I had managed to do this after a couple of hours of trial and error, the initial migration wouldn't authenticate. My username, password and database name were all correct.

After a couple more hours of searching I came across a snippet at the bottom of a stackoverflow Q & A that stated using localhost instead of the IP address in the .env file would fix the problem. It did, but it caused another problem with authentication which I still haven't fixed....

What a pain! To get round this problem, I set up a remote database on a server I host my websites with, which took around an hour of research into remote access, and we're now up and running with all the framework required to start my project.

I set up the database access in the .env file and I was ready to go!

Requirements from my Laravel App

Based on the user stories above, I came up with a rough set of requirements - these were open to change as the application developed and more requirements were thought of.

I tend to work in a roughly Agile way, and wanted to get to MVP status pretty quickly, so my requirements were fairly simple - I wanted to make a CRUD application that could:

  • Have CRUD functionality for all of our Courses
  • Have CRUD functionality for all of our Cohorts
  • Have CRUD functionality for all of our Sessions
  • Have CRUD functionality for all of our Funders
  • Have CRUD functionality for all of our Trainers
  • Have CRUD functionality for all of our Zoom Rooms
  • The ability to take a course and make new instances of that course.
  • The ability to attach different sessions to different instances of a course - making each course unique.
  • The ability to edit each session in each instance individually, so we can set a date, a trainer and a zoom room.'

The CRUD functionality is simple, especially in Laravel. Create a migration, model and controller for each and decide what fields you want in your database.

The tougher bit was deciding how to store the data for the sessions of each instance. I decided on an intermediate/pivot table in my MYSQL database called instance_sessions - where each instance would have an id, each session would have an id and that combination would have to be unique, so the same session couldn't be added twice.

As you can see, some fields had to be nullable, as these were where we would have missing pieces of data. For example, we wouldn't always know what trainer was taking which session, or the date the session was taking place on.

An Overview of setting up CRUD functionality in a Laravel App

Coming soon

Setting up the MySQL Pivot Table in Laravel

Coming soon

The Laravel Scheduling App so Far...

I'm pleased to say I've got a working application, with CRUD functionality working as expected for courses, cohorts, sessions, trainers and zoom rooms. I have also been able to get instances of courses, with sessions assigned to an instance.

Roadmap

For those interested in following, and more for me to keep my thoughts in track - here's a roadmap of changes I'll be putting in the application:

  • Front end validation when attempting to add sessions that are already included in an instance
  • Google calendar event creation for each instance session. Bonus points for automatically adding the trainer for each instance session.
  • Add an optional second trainer for each instance session.
  • Add user types. I will need a super admin, admin staff, trainers and students.
  • Different views loading for each group dependant on user
  • Merge all CRUD functionalities into one page - no need for separate pages for viewing courses, cohorts, zoom rooms etc.
  • Potentially remove zoom rooms as they are no longer used :-) - however they have been replaced by google meets. If there is a way to add a google meet room to the calendar invite the link for it could be displayed on the page via API (if that functionality exists in the API)
  • Dashboard functionality for different users - mainly showing what sessions are coming up - for learners this means showing their course timetable. For teachers this shows all their sessions from all instances.

There will be so much more than this, as i feel this could develop in time into a full learner management system, but for now this seems like a good roadmap!

I hope you enjoyed this article, and keep up to date! Should you wish to get in touch, please use the form below!

Get in touch!

Let's work together

We’d love to hear from you! Send us a message using the form opposite, or email us. We’d love to hear from you! Send us a message using the form opposite, or email us.

Optional
Max. 500 characters