2017-02-26 46 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

是否有可能做到這一點的服務提供商?正在嘗試製作導航欄。 –