雄辩的模型继承 - 多表设计

Assume we have two db tables: posts and threads:

threads
   id - integer
   title - string
posts
   id - integer
   body - text
   created_at - timestamp
   thread_id - integer (fk)

and two Eloquent models:

class Post extends Model { 

   public function thread()
   {
       return $this->hasOne('App\Thread');
   }  
}


class Thread extends Post { 

   protected $table = 'threads';

   public function post()
   {
      return $this->belongsTo('App\Post');
   } 
}

What I want to achieve is Thread object having id, title, body, created_at attributes, while Post object having id, body, created_at attributes.

Yet, I still get error:

Column not found: 1054 Unknown column 'body' in 'field list'

which is MySQL error that basically means that Laravel's trying to look up the body column in the threads table. However, it is stored in the posts table.

What you are trying to do is unnecessary with Eloquent.

The data that is retreived from the database iss storred in the $attributes property.

So unless you are sharing any behaviour you don't need to inherit from anything other than Model.

OK, so here is my updated answer after some research on your question. As you have defined table schema i.e

threads
   id - integer
   title - string
posts
   id - integer
   body - text
   created_at - timestamp
   thread_id - integer (fk)

This means Thread has many or just one (depends on relation) Post, and Post belongs to Thread, so the relationship would be something like this

class Thread extends Model{ 
   protected $table = 'threads';
   public function post()
   {
      return $this->hasMany('App\Post');//Or hasOne('App\Post')
   } 
}
class Post extends Model { 
   public function thread()
   {
       return $this->belongsTo('App\Thread');
   }  
}

What you want to achieve is Thread object having id, title, body, created_at attributes, while Post object having id, body, created_at attributes.

Now according to current scene, One Thread, may have more than one Post. Here you'll always get body and created_at in relationship for object Thread e,g Thread::with('post')->get();, and vice versa