For clarity I suggest you name your relations singular for hasOne/belongsTo and plural for belongsToMany/hasMany
so on the User and Thread it will be:
public function posts() ...
Now, this is in wrong order:
class User {
public function posts() {
// return $this->hasManyThrough('Thread', 'Post'); // wrong, change to:
return $this->hasManyThrough('Post', 'Thread');
}
}
Apart from that your relations look good, so you should be able to do this:
$thread = Thread::with('posts.user')->find($threadId); // eager load relations
$thread->posts; // Eloquent Collection of Post models
foreach ($thread->posts as $post)
{
$post->user; // author's User model
}
And by the way you can always have a look at the Laravel.io source: https://github.com/LaravelIO/laravel.io/