在父表和查找表之间创建一个Eloquent关系?

问题描述:

我正在使用Laravel 4.2,并且我正在慢慢构建一个复杂的网站,并且我遇到了两张表格之间的关系,我无法立即想出如何与Eloquent一起映射。下面是相关的模式:在父表和查找表之间创建一个Eloquent关系?

table `missions` 
mission_id (PK) | name   | launch_site_id (FK) 
------------------------------------------------------ 
1    | someMission | 1 
2    | anotherMission | 3 
3    | moreMissions | 1 

table `launch_sites` 
launch_site_id (PK) | name | location 
------------------------------------------------------ 
1     | Kwaj | <some coordinate> 
2     | Florida | <some coordinate> 
3     | Russia | <some coordinate> 

正如你可以看到,该表launch_sitesmissions查找表,每个任务都有一个发射场(保证)。

我试着用雄辩ORM一个hasOne & belongsTo关系表示此:

class Mission extends Eloquent { 
    public function launchSite() { 
     return $this->hasOne('LaunchSite'); 
    } 
} 

class LaunchSite extends Eloquent { 
    protected $table = 'launch_sites'; 

    public function mission() { 
     return $this->belongsTo('mission'); 
    } 
} 

不过,我很快就意识到这是行不通的发射场不“属于”一个使命。有了这层关系,我得到的错误:

Column not found: 1054 Unknown column 'launch_sites.mission_id' in 'where clause' (SQL: select * from launch_sites where launch_sites . mission_id = 3 limit 1)

我想要的是什么关系设置在机锋这样我就可以正确地查询和像这样一个任务获取发射场?

Mission::{{Some Query}}->with('launchSite'); 

翻转你的关系。 Mission属于LaunchSite而不是其他方式。

class Mission extends Eloquent { 
    public function launchSite() { 
     return $this->belongsTo('LaunchSite'); 
    } 
} 

class LaunchSite extends Eloquent { 
    public function mission() { 
     return $this->hasOne('mission'); 
    } 
} 

顺便说一下,您不应该指定表名称LaunchSitelaunch_sites遵循约定。