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

时间:2013-06-05 15:08:04

标签: laravel laravel-4 eloquent

在之前的一个问题(Getting the name of the foreign key with eloquent)中,我在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        |
+------------+------------------+

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

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

2 个答案:

答案 0 :(得分:6)

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

修改

好的,您似乎想要将 unittypes 表与单位表相关联。您在单位表中的外键是类型,因此:

单位型号

class Unit extends Eloquent 
{

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

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

单位型号应如下所示:

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>   

免责声明:我会亲自合并单位和单位类型表,因为它无缘无故地复杂化了(根据给出的信息)。另外,请参阅your previous question and my answer以充分了解正在发生的事情。

答案 1 :(得分: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();

请注意,您需要添加'()'才能将其用作查询。