从一个到多个(反向)关系laravel

时间:2017-02-26 05:38:05

标签: php laravel laravel-5.3 blade laravel-blade

我有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

2 个答案:

答案 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