如何使用Eloquent ORM将一个表与其他表相关联

Ela*_*ley 2 laravel eloquent laravel-4

在之前的一个问题中(以雄辩的方式获取外键的名称)我在Laravel 4中询问了一对多与雄辩的关系,但是当我进入一个更复杂的Schema时,我开始越来越混淆它是怎么回事正确的方法.我想我可以简单地模仿常规的SQL查询,但我想以正确的方式做到这一点,使用模型和我用laravel和eloquent的所有工具.

所以这些是我的表(其中一些)

    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        |
+------------+------------------+
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,单位与军队和单位类型有1-n的关系.我想要实现的是,当我在视图中列出我的单位时,我没有显示军队和单位类型的ID,而是显示实际名称(可能还有一些其他信息将来会添加到这些表中,我是现在做基础知识).

您可以在之前发布的链接中看到我使用"hasMany"或"belongsTo"方法设置我的模型,这就是我如何查询以显示我不知道该怎么做的数据.

kJa*_*esy 6

我想我对你上一个问题的回答也会回答这个问题.你不需要第三张桌子.在您的单位表中,最后一个字段的名称应为army_id

编辑

好吧,似乎你想将unittypes表与单位表联系起来.您在Units表上的外键是type,因此:

单位型号:

class Unit extends Eloquent 
{

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

  public function unittype()
  {
    return $this->belongsTo('Unittype', 'type');
  }
}
Run Code Online (Sandbox Code Playgroud)

单元类型模型应如下所示:

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

军队模型

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

}
Run Code Online (Sandbox Code Playgroud)

你的问题确实是急于加载嵌套关系.所以,您的控制器(或路线)应该:

$armies = Army::with('units.unittype')->get();
Run Code Online (Sandbox Code Playgroud)

最后,你的观点

            <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>   
Run Code Online (Sandbox Code Playgroud)

免责声明:我会亲自合并单位和单位类型表,因为它无缘无故地复杂化了(根据给出的信息).另外,请参阅您之前的问题和我的答案,以便充分了解正在发生的事情.