在父 table 和查找 table 之间创建 Eloquent 关系?

Create a Eloquent relationship between a parent table and a lookup table?

我正在使用 Laravel 4.2 并且正在慢慢构建一个复杂的网站,我发现我的两个 table 之间存在一种关系,我无法立即弄清楚如何与 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>

如您所见,table launch_sites 是对 missions 的查找 table,每个任务都有一个发射场(保证)。

我尝试在 Eloquent ORM 中用 hasOnebelongsTo 关系表示:

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');
    }
}

但是,我很快意识到这行不通,因为发射场不是 "belong to" 任务。有了这种关系,我得到了错误:

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)

我想要在 Eloquent 中建立什么关系,以便我可以正确查询并从这样的任务中获取发射场?

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');
    }
}

顺便说一下,您不需要指定 LaunchSite 的 table 名称。 launch_sites 遵循惯例。