2

在上一个问题(Getting the name of the foreign key with eloquent)中,我询问了 Laravel 4 中与 eloquent 的一对多关系,但是当我进入一个更复杂的 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”方法设置了我的模型,这就是我如何进行查询以显示我不知道该怎么做的数据。

4

2 回答 2

6

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

编辑

好的,您似乎想将unittypes表与units表相关联。您在Units表上的外键是type,所以:

单元型号

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>   

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

于 2013-06-05T15:16:21.373 回答
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();

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

于 2013-06-05T15:14:44.683 回答