I would probably use a database view for this.
CREATE VIEW school_views AS
SELECT s.name,
s.phone,
sd.image,
r.rating_value,
r.status
FROM schools s,
school_details sd,
ratings r
WHERE s.id = sd.school_id
AND s.id = r.school_id
Then I'd create an Model for it and then in the controller I do
$schools = SchoolView::all();
return view('schools.index', compact('schools'));
That way I don't need to create any complicated eloquent query. Put the view creation in a migration file.
In yourup()
DB::statement("CREATE VIEW school_views AS
SELECT s.name,
s.phone,
sd.image,
r.rating_value,
r.status
FROM schools s,
school_details sd,
ratings r
WHERE s.id = sd.school_id
AND s.id = r.school_id");
and in your down()
DB::statement('DROP VIEW school_views');
However in your case I'd put all the fields in one table since they are one to one relationships. I'm not saying you always should put one to one in the same table but in this case I would at least for starters.