2015-01-21 4 views
0

Я использую 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 & 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'); 

ответ

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 соответствует конвенции.

Смежные вопросы