2016-08-15 1 views
0

Ich habe eine Produktklasse mit zwei Kategorie IDs angegeben. Ich habe die folgenden Beziehungen eingerichtet und jetzt möchte ich die products Ergebnismenge paginieren.Verschmelzbare Querybuilder in Laravel 5.2 zusammenfügen dann paginieren

public function productsWithFirstCategory() 
{ 
    return $this->hasMany('App\Entities\Product', 'category1_id'); 
} 

public function productsWithSecondCategory() 
{ 
    return $this->hasMany('App\Entities\Product', 'category2_id'); 
} 

public function products() 
{ 
    return $this->productsWithFirstCategory->merge($this->productsWithSecondCategory); 
} 

public function getProductsPaginatedAttribute() 
{ 
    return $this->products()->paginate(20); 
} 

Es scheint, ich nicht die Ergebnisse Paginieren kann, weil die Zusammenführung keine Query Builder zurückgibt - wie Paginieren ich eine fusionierte Ergebnismenge?

Antwort

1

Wenn Sie tun $ this-> productsWithFirstCategory, Sie Zugriff auf das Ergebnis Sammlung statt der Abfrage Builder, während Paginieren() nur auf Abfrage Bauer in Ihrem Szenario arbeiten können.

Um zu bekommen, was Sie brauchen, müssen Sie eine Union von 2 Abfragen tun. ersetzen Sie einfach Produkte() Verfahren mit:

public function products() 
{ 
    return $this->productsWithFirstCategory()->union($this->productsWithSecondCategory()); 
} 

die Vereinigung von 2 Abfrage Builder Dies wird zurückkehren, die Sie später in Ihrem getProductsPaginatedAttribute() Methode Paginieren kann.

+0

Obwohl '$ item-> products' die Produkte erfolgreich auflistet, bekomme ich die Fehlermeldung 'SQLSTATE [HY000]: Allgemeiner Fehler: 1 SELECTs links und rechts von UNION haben nicht die gleiche Anzahl von Ergebnisspalten (SQL: Wählen Sie Anzahl (*) als Aggregat von "products" wo "products". "category1_id" = 1 und "products". "category1_id" ist nicht null union select * von "products" wo "products "." category2_id "= 1 und" products "." category2_id "ist nicht null).' – user3791372

+0

Weitere reserach zeigt, dass die raw sql funktioniert, wenn keine Zählung abgerufen wird, obwohl – user3791372

+0

Es scheint, dass Eloquent Union Anfragen nicht korrekt behandelt, wenn es darum geht Zählen der Results - die Abfrage, die generiert wird, ist zumindest für MySQL nicht korrekt. Sie können den Paginator selbst erstellen, aber Sie müssen jedes Mal, wenn Sie eine einfache Seite abrufen müssen, alle Ergebnisseiten abrufen. Es könnte funktionieren, wenn Sie nicht zu viele Seiten haben - ist das ok für Sie? –