2017-07-28 6 views
0

Hey ich habe drei Tisch wie dieses ModellGROUPBY auf Beziehung Laravel

--table plan-- 
id 
name 
.... 

----table letter--- 
id 
plan_id 
.... 

---table person---- 
id 
plan_id 
name 
..... 

ich habe:

---Model plan--- 
class plan extends Model 
{ 
    protected $table = 'plan'; 
    public function letter(){ 
     return $this->hasOne('App\letter'); 
    } 
    public function person(){ 
     return $this->hasMany('App\person'); 
    } 
} 
--Model person-- 
class person extends Model 
{ 
    public function plan(){ 
     return $this->belongsTo('App\plan'); 
    } 
} 

--Model letter-- 
class letter extends Model 
{ 
    public function plan(){ 
     return $this->belongsTo('App\plan'); 
    } 
} 

Und in Steuerung schreiben i-Code wie folgt aus:

$letter = letter::find($id) // $id from url parameter and it's work 
return view('letter',['letter' => $letter]); 

Nö in Ich möchte auf den Namen der Person aus dem Buchstabenmodell als Unterscheidungsmerkmal zugreifen, also schreibe ich Code wie diesen

{{ @foreach ($letter->plan()->person()->groupBy('name')->get) as $person }} 

aber es Fehler wie folgt zurück: Call to undefined Methode Illuminate \ Database \ query \ Builder :: Person()

Wo ist mein Fehler (n)?

Antwort

0

Es gibt einen Unterschied zwischen $letter->plan() und $letter->plan. Wenn Sie es wie eine Methode aufrufen, gibt Laravel den Query Builder zurück. Wenn Sie es wie ein Attribut bezeichnen, wird Laravel das Modell aus dieser Beziehung zurückgeben.

Sie versuchen also, Ihr Modell im Abfrage-Generator aufzurufen. Dies ist eine Methode, die nicht existiert und den Fehler erzeugt. Dies wird Ihr Problem beheben:

$letter->plan->person()->groupBy('name')->get()

In Ihrem Controller können Sie tun:

$letter = letter::find($id) // $id from url parameter and it's work 
$persons = $letter->plan->person()->groupBy('name')->get(); 

return view('letter', compact('letter', 'persons')); 

Und in der Ansicht:

@foreach($persons as $person) 
+1

Außerdem ist es besser, zu eifrig Lastplan und Person '$ letter = letter :: mit ('plan.person') -> find ($ id)' + du meinst 'return view ('letter', ['persons' => $ persons]);' – Maraboc

+0

Allright dieses Problem ist behoben, aber dort zeigen eine andere pr oblem: Syntaxfehler oder Zugriffsverletzung: 1055 'mydb.person.id' ist nicht in GROUP BY –

+0

nah alles funktioniert jetzt gut, nur falsch konfiguriert, danke –