Вложенные отношения в Laravel - PullRequest
0 голосов
/ 04 октября 2018

У меня есть три модели в следующих отношениях:

Tour.php

class Tour extends Model
{
    public function category()
    {
        return $this->belongsTo('App\TourCategory', 'category_id');
    }

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

TourCategory.php

class TourCategory extends Model
{
    public function tours()
    {
        return $this->hasMany('App\Tour', 'category_id');
    }
}

Region.php

class Region extends Model
{
    public function tours()
    {
        return $this->hasMany('App\Tour');
    }
}

Я пытаюсь получить все туры с определенной категорией туров из каждого региона.

Например Получить все пешеходные экскурсии из региона Скалистых гор, Йеллоустоун, Йосемити

Я попробовал следующий код:

public function trekRegions( View $view)
{
    $category = TourCategory::where('slug','=','hiking')->first();
    $tours = $category->tours()->with('region')->get(['region_id']);
    $regions = $tours->pluck('region')->unique();
    $view->with('tregions',$regions);
}

Я хочу напечататьвсе названия туров под названием региона в навигационной панели Mega Menu, но приведенный выше код позволяет мне печатать название региона, но также печатает и туры из других категорий.

Мой код в интерфейсе

@if(!empty($tregions)) @foreach($tregions as $region)
<div class="col-sm-3">
  <strong class="title sub-link-opener">{{ $region->name }}</strong>
  <ul class="header-link">
    @foreach($region->tours as $tour)
    <li>
      <a href="{{ route('frontend-tourDetail',[$tour->slug]) }}">{{ $tour->title }}</a>
    </li>
    @endforeach
  </ul>
</div>
@endforeach @endif

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вы можете сделать это одним запросом

$tours = Tour::whereHas('category', function($c) {
    $c->where('slug', 'hiking');
})->whereHas('region', function($c) {
    $c->where('title', 'Rocky Mountain Region');
})->get();
0 голосов
/ 04 октября 2018

для вашего конкретного требования.

фильтр Regions which has hiking tours и энергичная нагрузка hiking tours

$regions = Region::whereHas('tours', function ($toutQuery) {
    $tourQuery->whereHas('tourCategory', function ($categoryQuery) {
        $categoryQuery->where('name', 'hiking');
    });
}) // filter to match your requirements.
->with([
    'tours' => function ($toursQuery) {
        $toursQuery->whereHas('tourCategory', function ($categoryQuery) {
            $categoryQuery->where('name', 'hiking');
        });
    }
]) // load matching tours.
->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...