2013-06-05 1 views
2

В предыдущем вопросе (Getting the name of the foreign key with eloquent) Я задал вопрос об одном из многих взаимоотношений с красноречивым в Laravel 4, но когда я попадаю в более сложную схему, я начинаю все больше и больше смущенно о том, как правильно это сделать. Думаю, я просто могу имитировать обычный SQL-запрос, но я хочу сделать это правильно, используя модели и все инструменты, которые у меня есть с laravel и красноречивым.Как связать один стол с другими, используя Eloquent ORM

Так вот мои столы (некоторые из них)

Units 
+------------+------------------+ 
| Field  | Type    | 
+------------+------------------+ 
| id   | int(10) unsigned | 
| name  | varchar(255)  | 
| type  | int(11)   | 
| created_at | timestamp  | 
| updated_at | timestamp  | 
| value  | int(11)   | 
| army  | int(11)   | 
+------------+------------------+ 

    Armies 
+------------+------------------+ 
| Field  | Type    | 
+------------+------------------+ 
| id   | int(10) unsigned | 
| name  | varchar(255)  | 
| created_at | timestamp  | 
| updated_at | timestamp  | 
| color  | varchar(255)  | 
+------------+------------------+ 

    Unittypes 
+------------+------------------+ 
| Field  | Type    | 
+------------+------------------+ 
| id   | int(10) unsigned | 
| name  | varchar(255)  | 
| created_at | timestamp  | 
| updated_at | timestamp  | 
+------------+------------------+ 

Как вы можете видеть блоки имеют 1-п отношения с армиями и unittypes. То, что я хочу достичь, когда я перечисляю свои единицы на представлении, что вместо идентификатора армии и единиц измерения я показываю фактическое имя (и, возможно, некоторую другую информацию, которая будет добавлена ​​в будущем к этим таблицам, я делая основы в данный момент).

Вы можете видеть ссылку, опубликованную до того, как я установил свои модели с помощью методов «hasMany» или «belongsTo», так как я делаю запрос, чтобы показать данные, что я не знаю, как это сделать ,

ответ

4

Я думаю, что мой ответ на ваш предыдущий вопрос ответит и на этот вопрос. Вам не нужна третья таблица. А в таблице единиц, имя последнего поля должно быть army_id

Редактировать

Хорошо, кажется, что вы хотите связать unittypes таблицу в единиц таблицы. Ваш внешний ключ на единиц таблица типа, так:

модель Unit:

class Unit extends Eloquent 
{ 

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

    public function unittype() 
    { 
    return $this->belongsTo('Unittype', 'type'); 
    } 
} 

Unittype модель должна выглядеть следующим образом:

class Unittype extends Eloquent 
{ 
    public function units() 
    { 
    return $this->hasMany('Unit', 'type'); 
    } 
} 

модель армии

class Army extends Eloquent 
{ 
    public function units() 
    { 
    return $this->hasMany('Unit'); 
    } 

} 

Ваша проблема действительно связана с загрузкой вложенных отношений.Таким образом, ваш контроллер (или маршрут) должен сделать:

$armies = Army::with('units.unittype')->get(); 

Наконец, ваш Посмотреть

  <ul> 
      @foreach($armies as $army) 
       <li>{{$army->name}} 
        <ul> 
         @foreach($army->units as $aunit) 
         <li>   
          <b>{{ $aunit->name }}</b> which belongs to <b>{{ $aunit->unittype->name }}</b> 
         </li> 
         @endforeach 
        </ul> 
       </li> 
      @endforeach  
     </ul> 

Отказ от ответственности: Я бы лично объединить блоки и unittypes таблицу как это усложнять без каких-либо причин (из приведенной информации). Кроме того, обратитесь к your previous question and my answer, чтобы полностью понять, что происходит.

+0

Единичные типы могут иметь плохо выбранное имя, но это таблица, которая должна быть, она будет иметь контент в будущем, не связанный с таблицей единиц. Мои модели уже были похожи на то, что вы описали в обоих ответах, на самом деле это логика в контроллере, что мне трудно понять, так как unittype и армия полностью не связаны друг с другом, и они имеют только общее, что у Unit есть экземпляр каждого из них. –

+0

Также в контроллере может отсутствовать то, что я получаю «Неопределенная переменная: единицы» на мой взгляд –

0

Это способ, которым Вы должны быть в состоянии использовать их все:

$army = Army::find(1); 

foreach($army->units as $unit) 
{ 
    echo $unit->name; 

    /// and you can 

    echo $unit->army->name; /// too 
} 

И если вам нужно добавить немного больше фильтра, вы можете

$army = Army::find(1); 
$units = $army->units()->where('value','>',100)->get(); 

Обратите внимание, что вам нужно добавить '()', чтобы использовать его в качестве запроса.

+0

Я думаю, что лучше будет _определить обратное отношение_ в модели 'Unit'. –