代码之家  ›  专栏  ›  技术社区  ›  psudo

laravel中的嵌套关系

  •  2
  • psudo  · 技术社区  · 6 年前

    我有以下三种关系模式:

    旅游.php

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

    旅游类.php

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

    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);
    }
    

    我想打印所有旅游名称下面的地区名称在大菜单导航栏,但上面的代码不允许我打印地区名称,但也打印其他类别的旅游。

    我的代码在前端

    @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 回复  |  直到 6 年前
        1
  •  1
  •   Tharaka Dilshan    6 年前

    你的特殊要求。

    滤波器 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();
    
        2
  •  0
  •   Serhii Shliakhov    6 年前

    $tours = Tour::whereHas('category', function($c) {
        $c->where('slug', 'hiking');
    })->whereHas('region', function($c) {
        $c->where('title', 'Rocky Mountain Region');
    })->get();