Ich habe eine Tabelle mit ProduktenLaravel 4.2 n + 1 ohne eager loading
products
------------------------------------------------
id product_code purchase_type quantity
1 106 new 1
2 107 renew 3
und eine Preisliste für Produkte
price_list
----------------------------------------------------------------------
id product_code purchase_type minimum maximum unit_price
1 106 new 1 25 20
2 106 new 26 50 16
3 106 new 51 100 14
Wenn ich die Produkte auf einer Seite angezeigt werden, ich brauche die angezeigt werden Preis mit der Formel
getPrice(product_code, purchase_type, quantity) for every product
mit
foreach(Product::all() as $product){
{{ $product->product_code }}
{{ $product->purchase_type }}
{{ $product->quantity }}
{{ PriceList::getPrice($product->product_code, $product->purchase_type, $product->quantity) }} - this one is the n+1 problem
}
Preisliste :: getPrice() ist so etwas wie:
public static function getPrice($productCode, $purchaseType, $quantity){
return PriceList::where('product_code', $productCode)
->where('purchase_type', $purchaseType)
->where('minimum', '>=', $quantity)
->where('maximum', '<=', $quantity)
->get()->first()->unit_price;
}
Ich kann nicht eine effizientere Art und Weise zu finden scheinen. Und wenn ich über 1000 Produkte ausstelle, dann wird es sehr langsam. Ich kann keinen Weg finden, eifrig zu laden.
Versuchte $ products = Produkt :: mit ('price_list') -> get(); Ich muss das Produkt zurückgeben, das alle 3 Bedingungen entspricht: getPrice ($ productCode, $ purchaseType, $ quantity) Es sollte die price_list mit mindestens 1 und maximal 25 und purchase_type Renew-Lizenz zurückgeben, sondern stattdessen mindestens 250 maximal 499 zurückgegeben eine Möglichkeit, die Bedingung wie $ products = Product :: mit ('price_list', $ query-> wo ('price_list.product_code', 'product.product_code') -> where ('price_list.purchase_type, product.purchase_type) anzugeben) -> bekommen(); oder etwas ähnliches? – George