2016-04-18 5 views
3

У меня есть эта платформа, которую я создаю для событий, связанных с пищей. Существует множество экспонентов, которые посещают несколько мероприятий. У каждого пищевого напитка есть свое меню блюд, которые они обслуживают, в нескольких категориях.Laravel Eloquent group by with pivot table & relations

Проблема/что я хотел бы достичь

Я хотел бы сделать меню для каждого события, пробегает по всем участникам (которые присутствуют), а затем с указанием блюд по категориям.

Нечто подобное;

/меню/{EventID}

блюда категория 1

  • блюдо из Экспонента
  • блюда из экспонента B

блюда категория 2

  • блюда от exh A
  • блюдо из EXH C
  • блюдо из EXH D

...

Модели

модель Event

class Event extends Model 
{ 
    protected $table = "events"; 

    public function exhibitors() 
    { 
     return $this->belongsToMany('App\Exhibitor', 'events_exhibitors'); 
    } 

Dish модель

class Dish extends Model 
{ 
    // 

    protected $table = "dishes";  


    public function category() 
    { 
     return $this->hasOne('App\Category', 'id', 'category_id'); 
    } 

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

Экспонент модель

class Exhibitor extends Model 
{ 
    protected $table = "exhibitors"; 

    public function events() 
    { 
     return $this->belongsToMany('App\Event', 'events_exhibitors'); 
    } 

    public function dishes() 
    { 
     return $this->hasMany('App\Dish'); 
    } 
} 

Структура базы данных

Существует поворотный стол для регистрации, который foodtrucks перейти на какие события. До сих пор, я думаю (надеюсь) мои отношения работают. Надеюсь, что этот образ проявит достаточно;

DB structure

То, что я пытался

Я попробовал несколько вещей, но я думаю, что мое понимание в Laravel красноречивого не хватает, чтобы понять логику этого вопроса.

$dishes = Event::where('id', $id) 
      ->with(['exhibitors.dishes' => function($q) { 
      $q->select('dishes.dish_data'); 
     }])->get(); 

Или

$dishes = Event::with(array('exhibitor.dish') => function($query) use ($sub){ 
      $query->where('name',$sub);}))->get(); 

У меня нет абсолютно никакого понятия, как это сделать с помощью красноречивых или как это будет работать в представлении.

ответ

0

попробовать что-то вроде этого:

Он будет получать все идентификаторы экспонентов, которые подключены к событию. Затем он получит все категории, в которых подключенные блюда имеют экспонент_ид, который находится в массиве идентификаторов экспонента.

Категория Модель

class Category extends Model 
{ 
    protected $table = "categories";  


    public function dishes() 
    { 
     return $this->hasMany('App\Dish', 'category_id'); 
    } 
} 

Действие контроллера

$event = Event::findOrFail($id); 

$exhibitorIds = $event->exhibitors()->select('exhibitors.id')->get()->pluck('id')->all(); 

$categories = Category::whereHas('dishes', function($query) use ($exhibitorIds) { 
    $query->whereIn('exhibitor_id', $exhibitorIds); 
})->with(['dishes' => function($query) use ($exhibitorIds) { 
    $query->whereIn('exhibitor_id', $exhibitorIds); 
}])->get(); 

return view('events.menu', compact('event', 'categories')); 

Посмотреть

@foreach($categories as $category) 
<h2>{{ $category->name }}</h2> 
<ul> 
    @foreach($category->dishes as $dish) 
     <li>{{ $dish->dish_data }}</li> 
    @endforeach 
</ul> 
@endforeach 
+0

Спасибо за вашу помощь. Это порождает ошибку строителя «explode() ожидает, что параметр 2 будет строкой, объект задан« at »$ categories ...» – essepikker

+0

Ok экспонентов, где коллекция Laravel, с -> all() теперь возвращает массив. И запрос секунд не использовал экспонентов – blablabla

+0

Все еще бросает ту же ошибку ... "explode() ожидает, что параметр 2 будет строкой, объект указан". Когда я dd ($ exhibitorIds), это действительно массив, содержащий идентификаторы. – essepikker