我有2个模型' Trips.php'
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 :(得分: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
答案 1 :(得分: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