Just another thought which kind of a combination of your two suggestions...
Create account_types or profiles tables for each user type Student, Parent, Teacher/Personal.
Store all users in a single users table with the attributes needed for authentication (e.g. email, password, reset token, etc) and a two additional columns (profile_id, profile_type) to store a polymorphic relationship.
Then define a polymorphic relationship (maybe profiles) on your users model to the profile models.
When you query a user for simple authentication, you most likely are not interested in the profile data (e.g. firstname, lastname, etc), just the email, password which would all be present on the user table.
When you want to check permissions for a user, you can check the profile_type column on the user table to determine the account type.
If you want all users that are teachers, students or parents, define scopes on your users model to check the profile_type column to handle that.
While relationships between two entities on the same table are totally valid, you can create your relationships between account types to their respective profile models. So the parent model has a relationship to the student model, etc.
I'm not suggesting that this is better or worse than any other ideas you have or may hear, just another alternative.