2014-03-04 26 views
0

我的客戶只是要求我在產品瀏覽頁面上創建一個類似的產品部分。他希望顯示與當前查看的產品類似的價格範圍內的三種不同的產品。Laravel 4雄辯 - 類似產品基於價格

我有一個產品表(或產品雄辯模型,如果你想),這些產品可以有多個價格,其中一個可以標記爲主要價格(所以我有一對多表product_variants,這意味着變種雄辯模型)。

什麼問題?我想建立一個雄辯的查詢,可以根據選擇三個附加產品,主要價格是多麼接近。例如,我們正在查看主產品價格爲40美元的產品,但在數據庫中,我們也有這些主產品--45美元,38美元,37美元,50美元,35美元的產品。因此,我必須展示與價格最接近的產品,因此這將是38美元(僅差2美元),37美元(僅差3美元)和45美元或35美元之一(5美元差價)之一。

我知道我可以做到這一點,但我迄今爲止的解決方案(在我的頭上)將從每個方面(從價格上下)抓取三個產品,然後只檢查它們是否更接近價格。

我不是我的工作電腦上,但到目前爲止該查詢在我的腦海中存在:

$higher = Product::with(['variants' => function($q) use ($productPrice){ 
              $q->whereMain(1); 
              $q->where('price', '>=', $productPice); 
              $q->orderBy('price','asc'); 
             }]->where('id','!=', $productId)->get()->take(3); 

像這樣的事情會讓我3種產品價格比的產品更高,更低的價格相似。

但最接近的匹配的魔力會發生在某種形式的foreach中,我正在檢查價格的減法和保存最接近的匹配。

我不喜歡這個解決方案,因爲它可能是時間研究,因爲可以高度訪問產品視圖。是的,我可以將查詢保存到Redis緩存或其他東西,但仍然...

有沒有人有更好的想法如何實現這三個產品更容易?

感謝

回答

0

使Tzook的答案更Laravel友好。

在您的Variant型號中添加該功能。

public function scopeOfSimilarPrice($query, $price, $limit = 3) 
{ 
    return $query->orderBy(DB::raw('ABS(`price` - '.$price.')'))->take($limit); 
} 

現在這個功能是更動態的,你可以在任何地方使用它,更容易使用。

現在既然我們已經知道你的產品,我實際上認爲懶加載更容易閱讀和理解。

// Find your product 
$product = Product::find(1); 

// Eager load variants with closest price 
$product->load('variants')->ofSimilarPrice($productPrice); 

foreach($product->variants as $variant) { 
    echo $variant->details; 
    echo $variant->price; 
} 
+0

這個幫助了很多,現在正在工作,謝謝。 – marwellt

1
select id 
from products pr 
order by ABS(price-$productPice) ASC 
LIMIT 3 

我會告訴你使用這種查詢得到最接近的項目,然後莫比創造eloquents扔的id發現什麼。

+0

謝謝你的回答。 – marwellt