如何通过视图中的表显示hasMany()关系。

时间:2016-07-26 17:50:58

标签: php laravel

我试图在我的视图中显示一个包含来自我的位置表(地址,城市等等)和资源表(名称,描述)的信息的内容的表格,他们'由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');
    }  
}



 的 resource.blade.php



<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;
&#13;
&#13;

我只是想添加一两列来查看它是否正常工作,但我一直在resourcelocations上得到一个未定义的变量,仍然试图将我的头围绕在laravel以及关系如何工作,所以也许我的逻辑搞砸了。任何帮助都会很棒!

感谢。

2 个答案:

答案 0 :(得分:1)

你的人际关系似乎有些混乱。我认为它可以与你拥有它的方式一起工作,但是你让它变得更加困惑。

首先,从删除ResourceLocation模型开始。您可以直接关联resourceslocations,而无需中间模型(尽管您仍然需要该表)。这就是所谓的属于多对的关系。

我还建议当你有一个可以返回许多记录的关系时(例如,如果资源可以有多个位置),你应该命名与这些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),以便更好地了解数据的管理方式