我正在使用Laravel 4.2而且我正在慢慢构建一个复杂的网站,我遇到了两个桌面之间的关系,我无法立即弄清楚如何与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_sites
是missions
的查找表,每个任务都有一个启动站点(保证)。
我尝试使用hasOne
&amp; Eloquent ORM中的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');
}
}
但是,我很快意识到这不起作用,因为发射站点不属于“任务”。通过这种关系,我得到错误:
未找到列:1054'where子句'中的未知列'launch_sites.mission_id'(SQL:select * from
launch_sites
其中launch_sites
。mission_id
= 3 limit 1)
我想要在Eloquent中建立什么样的关系,这样我才能正确查询并从这样的任务中获取启动网站?
Mission::{{Some Query}}->with('launchSite');
答案 0 :(得分:1)
翻转您的人际关系。 Mission
属于LaunchSite
而不是相反。
class Mission extends Eloquent {
public function launchSite() {
return $this->belongsTo('LaunchSite');
}
}
class LaunchSite extends Eloquent {
public function mission() {
return $this->hasOne('mission');
}
}
顺便说一下,您不需要指定LaunchSite
的表名。 launch_sites
遵循惯例。