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

时间:2015-01-21 10:31:30

标签: php mysql database laravel orm

我正在使用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_sitesmissions的查找表,每个任务都有一个启动站点(保证)。

我尝试使用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_sitesmission_id = 3 limit 1)

我想要在Eloquent中建立什么样的关系,这样我才能正确查询并从这样的任务中获取启动网站?

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

1 个答案:

答案 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遵循惯例。