2017-10-25 6 views
1

Ich erstelle eine Anwendung mit Laravel und ich versuche, mit Eloquent arbeiten. Ich habe zwei Tabellen: Bestellungen und Artikel.Eloquent hasMany Filter und eifrig laden

Jeder Artikel hat einen Typ (int-Daten):

  • 1 => Buch
  • 2 => Video

Jeder Auftrag hat ein Buch und viele Videos.

In meinem Bestellmodell möchte ich ein Buch und andere Artikel Beziehungen haben. Also, ich diesen Code haben:

public function book() 
{ 
    return $this->hasMany('App\Item')->where('type', 1)->first(); 
} 

public function others() 
{ 
    return $this->hasMany('App\Item')->where('type', '!=', 1)->get(); 
} 

Aber, wenn ich mit meiner Beziehung eifrig Laden verwenden, bekam ich einen Fehler:

Order::with(['book', 'others'])->get(); 

Können Sie mir helfen, dieses Problem zu lösen?

Dank

Antwort

0

definieren, wie diese Beziehungen zu Ihrem Code Arbeit zu machen:

public function book() 
{ 
    return $this->hasOne('App\Item')->where('type', 1); 
} 

public function others() 
{ 
    return $this->hasMany('App\Item')->where('type', '!=', 1); 
} 

Aber es ist besser Beziehungen zu definieren, ohne where Einschränkungen:

public function book() 
{ 
    return $this->hasOne('App\Item'); 
} 

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

Und diese dann tun:

Order::with(['book' => function ($q) { 
     $q->where('type', 1); 
    }, 
    'others' => function ($q) { 
     $q->where('type', '!=', 1); 
    }]) 
    ->get(); 
+0

Hallo Alexey, Es funktioniert für andere Danke! Aber für Buch-Beziehung, bekomme ich ein Array mit einem Objekt statt direkt ein Objekt ... –

+0

@ D.Durand Ich habe es gerade getestet und Sie bekommen ein Objekt. Stellen Sie sicher, dass Sie die 'hasOne'-Beziehung verwenden. Um ein Buch zu erhalten, müssen Sie immer noch eine Sammlung von Bestellungen mit Büchern und anderen laden und darüber iterieren. –

+0

Entschuldigung, ich benutze hasMany anstelle von hasOne! Letzte Frage: Warum sagst du, ist es besser, nicht wo innere Beziehungen zu verwenden? –