a user is a normal user but once they apply to be a professional and are approved they will become a professional, would you guys use a simple enum for is_admin, is_professional or would you use Spatie roles and permissions?
@cushty If a user can become a professional, then like @tray2, I’d let them create a professional profile. You then implicitly know if a user is a “professional” or not based on whether they have an associated profile:
$isProfessional = $user->professionalProfile()->exists();
we have many categories that the professional can choose to cater for, would it be best to create a new table called categories? I'm struggling to work out what the association would be ie a professional has many categories maybe?
Yes, I’d also create a categories table to store categories. These can then be linked to professional profiles using a pivot table and many-to-many relation. You will then be able to look up professional profiles associated with a given category, or see which categories a professional profile is associated with.
we will have a very long application form, would it be ok to add the fields on the user's table or make a dedicated table for the application form? I am struggling with how the categories would sync with the application form
I’d make a dedicated table. When modelling things, you need to listen to yourself an how you explain things. When you use a noun (name) for something, that usually means it’s a model within your application’s domain and should probably have its own model and database table. More so if that application form then has its own state or workflow, i.e. it’s approved or rejected after submission. All of this application form-specific stuff is easier to model and representing in its own table rather than trying to shove it in your users table.