2017-12-20 2 views
0

Für ein neues Projekt arbeite ich an einem Webshop. Ich habe Produkte mit einer Eins-zu-viele-Beziehung zu Pflanzen Details. Anlagendetails haben einen Spaltenpreis. Ich muss die Produkte auf den Preis des ersten Details bestellen.Laravel Auftrag Eloquenziert nach Beziehung

Wenn ich eine Verbindung verwende, bekomme ich alle Produkte nach Preis sortiert, aber ich bekomme ein neues Produkt für jede Detailbeziehung.

Ich habe versucht:

$products = $products->get(); 
$products = $products->sortBy(function ($product, $key) { 
    return $product->plantDetails()->first()->price; }); 
    $products = $this->paginate($products, $perPage = 24, true); 
} 

mit $this->paginate Wesen:

public function paginate($items, $perPage = 15, $page = null, $options = []) { 
    $page = $page ?: (Paginator::resolveCurrentPage() ?: 1); 
    $items = $items instanceof Collection ? $items : Collection::make($items); 
    return new LengthAwarePaginator($items->forPage($page, $perPage), $items->count(), $perPage, $page, $options); 
} 

aber als ich die aktuelle Seite in der nicht Paginierung Link. Hat jemand irgendwelche Ideen?

+0

meinen Sie den Link der aktuellen Seite von Verfahren Paginierung zu machen wie '$ Produkte-> render()' nur zeigt nichts, aber die anderen Seiten zeigt so etwas wie 'http://site.test/products? page = 2'? – Chay22

+0

$ products-> links() rendert die Seitenumbruch wie erwartet, aber der Link auf der http: //site.test/products Seite wäre http://site.dev/?page=2 –

+0

haben Sie versucht, die 3. zu entfernen Param auf 'paginate'? Oder den Pfad zum Paginator manuell festlegen? '$ this-> paginate ($ products, 24) -> setPath ($ request-> url());' – Chay22

Antwort

0

Whay wenn man so etwas verwenden:

$products = $products->sortBy(function ($product, $key) { 
    return $product->plantDetails()->first()->price; })->paginate(24) 

Paginate wird das auch ... erhalten tun, aber ich verstehe nicht, was Sie unter „müssen die Produkte auf den Preis bestellen von das erste Detail? "

first() gibt das erste Objekt von plantDetails zurück und zuerst() -> price price gibt genau die Preiseigenschaft dieses Objekts zurück.

wenn Sie Methode von Query Builder verwenden beitreten dann brauchen Sie nicht ti eloquent Beziehungen verwenden ..

Es könnte so etwas wie das:

$products = DB::table('products')-> 
join('plantDetails','key','=','key') ->sortBy('price')->paginate(24); 

wo Schlüssel die gemeinsame Spalte zwischen den Produkten und PflanzDetails.

Hoffe, dass es hilft,

+0

$ products = $ products-> orderBy (Funktion ($ product, $ key) { Rückgabe $ product-> plantDetails() -> first() -> Preis;}) -> paginate (24) Ich bekomme strtolower() erwartet, dass Parameter 1 ein String ist, object object error. Es gibt diesen Fehler bei paginate() oder get(). Wenn ich das Paginat entferne, erhalte ich ein Builder-Objekt. Wenn ich count() für das Objekt verwende, erhalte ich die richtige Menge an Objekten –