2016-04-18 10 views
3

Ich habe diese Plattform, die ich für Foodtruck Ereignisse erstellen. Es gibt einen Pool von Ausstellern, die an mehreren Veranstaltungen teilnehmen. Jeder Foodtruck hat eine eigene Speisekarte mit Gerichten, die in verschiedenen Kategorien serviert werden.Laravel Eloquent Gruppe von mit Pivot-Tabelle & Beziehungen

Das Problem/was ich

ich für jedes Ereignis ein Menü machen möchten erreichen möchten, Looping durch alle Aussteller (die teilnehmen) und dann die Gerichte nach Kategorie zeigt.

So etwas wie das;

/Menü/{eventid}

Dish Kategorie 1

  • dish vom Aussteller A
  • dish vom Aussteller B

Dish Kategorie 2

  • dish von exh A
  • Gericht aus exh C
  • Gericht aus exh D

...

Models

Ereignismodell

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

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

Dish Modell

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

Aussteller Modell

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

Datenbank-Struktur

Es gibt eine Pivot-Tabelle zu registrieren, welche die Ereignisse zu foodtrucks gehen. Bisher denke ich (hoffe), dass meine Beziehungen funktionieren. Ich hoffe, dieses Bild zeigt genug;

DB structure

Was ich

habe versucht, ich habe mehrere Dinge ausprobiert, aber ich glaube, meine Einsicht in Laravel eloquent die Logik hinter dieser Frage zu verstehen, fehlt.

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

Oder

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

Ich habe absolut keine Ahnung, wie dies durch Eloquent zu erreichen, oder wie wäre dies in der Ansicht arbeiten.

Antwort

0

versuchen, etwas wie folgt aus:

Es werden alle IDs der Aussteller erhalten, die mit dem Ereignis verbunden sind. Dann wird es alle Kategorien bekommen, in denen die verbundenen Teller eine Aussteller_id haben, die im Array von Aussteller IDs ist.

Kategorie Model

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


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

Controller Aktion

$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')); 

Ansicht

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

Vielen Dank für Ihre Hilfe. Dies löst einen Builder-Fehler aus "explode() erwartet, dass Parameter 2 als String, Objekt als gegeben" at "$ categories ..." gilt. – essepikker

+0

Ok, die Aussteller-IDs sind eine Laravel-Sammlung, mit -> all() wird jetzt ein Array zurückgegeben. Und die Sekundenabfrage hat die ausstellerids nicht verwendet. – blablabla

+0

Immer noch den gleichen Fehler ... "explode() erwartet, dass Parameter 2 ein String ist, ein Objekt ist gegeben". Wenn ich dd ($ AusstellerIDs), ist es in der Tat ein Array mit der IDs. – essepikker

Verwandte Themen