Laravel 4 Eloquent - 基于价格的类似产品

时间:2014-03-04 11:42:00

标签: sql laravel eloquent

我的客户刚要求我在产品视图页面上创建一个类似的产品部分。他希望在与目前产品相似的价格范围内展示三种不同的产品。

我有一个产品表(或者如果你想要的产品雄辩模型),这些产品可以有多个价格,其中一个可以标记为主要价格(所以我有一对多的表product_variants,这意味着变体雄辩的模特)。

有什么问题?我想建立一个雄辩的查询,可以根据最接近主要价格选择三个额外的产品。

例如,我们正在查看主要价格为40美元的产品,但在数据库中我们还有一些主要价格的产品--45美元,38美元,37美元,50美元,35美元。

因此,我必须展示最接近价格的产品,因此价格为38美元(仅差价2美元),37美元(仅3美元差价)和45美元或35美元(5美元差价)之一。

我知道我可以这样做,但到目前为止我的解决方案(在我的脑海中)将是从每一侧获取三个产品(从价格上下),然后只检查它们哪一个更接近于价。

我不在我的工作PC上,但到目前为止,这个查询存在于我的脑海中:

$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缓存或其他东西,但仍然......

是否有人更了解如何更轻松地实现这三种产品?

由于

2 个答案:

答案 0 :(得分:1)

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

我会告诉你使用这种查询来获取最接近的项目,然后maby创建说服者发现了id或者其他东西。

答案 1 :(得分: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;
}