What's being stored on your club_position and club_student table? It's not obvious where the position is assigned to the student?
If every club has the same positions available (there is a default list you choose from) then I think you have an extra table which is complicating matters.
From your description I would have thought your structure should be more like:
- students [id, name]
- clubs [id, name]
- positions [id, name]
- club_students [id, club_id, student_id, position_id, points] with index unique(club_id, student_id, position_id)
You'd then set the relationships on them as follows
- students -> hasMany clubs_students
- club ->hasMany club_students
- positions ->hasMany club_students
- club_students ->belongsTo (one for each of them)
I think you could then just load them all as you stated student->with(club_students,club_students.club,club_students.position) for eager loading.
This of course then takes it away from using an actual pivot table, but would simplify your DB, so maybe is not the answer you were looking for?