2017-02-26 51 views
1

我有2款 'Trips.php'获取从一个DATAS许多(逆)关系laravel

public function region() 
{ 
    return $this->belongsTo('App\Region'); 
} 

Region.php

public function trips() 
{ 
    return $this->hasMany('App\Trip'); 
} 

我试图表明,在一个车次一个特定区域。例如:我有一个名为Lake Side的地区,我想列出所有在Lake Side地区的旅行。

我试过如下:

在控制器:

$trips = Trip::all(); 

鉴于:

@foreach($trips as $trip) 
<li><a href="#"> 
    {{$trip->region->name}}</a> 
    <ul class="dropdown"> 
     <li><a href="#"> 
      {{$trip->title}}</a> 
     </li>  
    </ul> 
</li> 
@endforeach 

这给我区的名称和行程的名字,但重复的区域名称,如果不止一个行程在同一地区制造。

并试图围绕另一种方式(反向):

<ul class="dropdown"> 
@foreach($regions as $region) 
<li><a href="#"> 
    {{$region->tour->title}}</a> 
</li> 
@endforeach 
</ul> 

而得到错误Trying to get property of non-object

回答

0

通过获取与地区的旅行,有什么你基本上得到的是一个区域的物业每趟。

而是做相反的Region::with('trips')->where('id', $regionId)->get(),你会得到他们的旅行地区。所以现在每个区域结果都有一个包含很多行程的旅行属性。

或者不要使用急切的加载。所以Region::firstOrFail($regionId)然后只使用$region->trips

而且,您可以通过他们循环像

// Can print region here 
@foreach($region->trips as $trip) 
    // Can print region's trips here 
@endforeach 
0

的一种方式做到这一点是使用whereHas()

$trips = Trip::whereHas('region', function($q) use ($regionName) { 
    $q->where('name', $regionName); 
})->get(); 

$trips$regionName的观点:

@foreach ($trips as $trip) 
    <li><a href="#">{{ $regionName }}</a> 
     <ul class="dropdown"> 
      <li><a href="#"> 
       {{ $trip->title }}</a> 
      </li>  
     </ul> 
    </li> 
@endforeach 

或者,您可以使用eager loading

$region = Region::where('name', $regionName)->with('trips')->first(); 

并在视图:

@foreach ($region->trips as $trip) 
    <li><a href="#">{{ $region->name }}</a> 
     <ul class="dropdown"> 
      <li><a href="#"> 
       {{ $trip->title }}</a> 
      </li>  
     </ul> 
    </li> 
@endforeach 
+0

是否有可能做到这一点的服务提供商?正在尝试制作导航栏。 –