在之前的一个问题(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”方法设置我的模型,这就是我如何进行查询以显示我不知道该怎么做的数据。
答案 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();
请注意,您需要添加'()'才能将其用作查询。