我试图在我的视图中显示一个包含来自我的位置表(地址,城市等等)和资源表(名称,描述)的信息的内容的表格,他们'由ID通过ResourceLocation表重新链接。这就是我到目前为止所拥有的:
资源控制器
....
public function resource()
{
$resources = Resource::all();
return view('pages.resource', compact('resources'));
}
public function location()
{
$locations = Location::all
return view (compact('locations'));
}
public function resourcelocation()
{
$resourcelocations = ResourceLocation::all();
return view (compact ('resourcelocations'));
}
...

/**
* Class ResourceLocation
*/
class ResourceLocation extends Model
{
...
public function resource ()
{
return $this->belongsTo('App\Models\Resource');
}
public function location ()
{
return $this->belongsTo('App\Models\Location');
}
}

资源模型
/**
* Class Resource
*/
class Resource extends Model
{
...
/** A resource can have many locations */
public function location()
{
return $this->hasMany('App\Models\ResourceLocation');
}
}

/**
* Class Location
*/
class Location extends Model
{
...
public function resource()
{
return $this->hasMany('App\ResourceLocation');
}
}

<table>
<tr>
<th>Resource Name</th>
<th>Description</th>
<th>Address</th>
<th>City</th>
<th>Zip Code</th>
<th>County</th>
</tr>
@foreach ($resourcelocations as $resourcelocation)
<tr>
<td> {{ $resourcelocation->id }}</td>
<td>
@foreach ($resourcelocation->resources as $resource)
{{ $resource->Name }},
@endforeach
</td>
<td>
@foreach($resourcelocations->locations as $location)
{{ $location->City }}
@endforeach
</td>
</tr>
@endforeach
</table>
&#13;
我只是想添加一两列来查看它是否正常工作,但我一直在resourcelocations
上得到一个未定义的变量,仍然试图将我的头围绕在laravel以及关系如何工作,所以也许我的逻辑搞砸了。任何帮助都会很棒!
感谢。
答案 0 :(得分:1)
你的人际关系似乎有些混乱。我认为它可以与你拥有它的方式一起工作,但是你让它变得更加困惑。
首先,从删除ResourceLocation
模型开始。您可以直接关联resources
和locations
,而无需中间模型(尽管您仍然需要该表)。这就是所谓的属于多对的关系。
我还建议当你有一个可以返回许多记录的关系时(例如,如果资源可以有多个位置),你应该命名与这些locations
而不是location
相关的方法。
考虑到所有这些,您的Resource
模型会......
public function locations()
{
return $this->belongsToMany('App\Models\Location', 'ResourceLocation');
}
我放'ResourceLocation'
的位置,应该是您为数据透视表命名的内容。
与您收到的Location
模型相同。
public function resources()
{
return $this->belongsToMany('App\Models\Resource', 'ResourceLocation');
}
现在应该大大简化,我们只更换了2种关系方法和2种关系方法和2种模型的3种模型。
现在,对于您的控制器,使用预先加载来获取所有资源位置会更有效。
$resources = Resource::with('locations')->get();
在你看来......
@foreach ($resources as $resource)
@foreach ($resource->locations as $location)
<tr>
<td>{{ $resource->id }}</td>
<td>{{ $location->name }}</td>
</tr>
@endforeach
@endforeach
答案 1 :(得分:0)
在您的资源管理器中,您没有传递任何resourcelocation
变量,因为我看到只调用了resources
。尝试在此行return view('pages.resource', compact('resources'));
要获取hasMany
中的第一个元素,您可以尝试以下内容:
$resource->location()->first();
您可以在将数据发送到视图之前使用dd(variable_name)
,以便更好地了解数据的管理方式