2014-03-04 5 views
0

입니다. 제 고객은 제품보기 페이지에서 유사한 제품 섹션을 만들도록 요청했습니다. 그는 현재보고있는 제품과 비슷한 가격대의 세 가지 제품을 표시하려고합니다.Laravel 4 Eloquent - 유사 제품 가격은

제품 테이블 (또는 원한다면 웅변 모델)이 있으며이 제품은 여러 가격을 가질 수 있습니다. 하나는 주요 가격으로 표시 할 수 있습니다 (따라서 일대 다 테이블 product_variants가 있습니다. 변형 웅변 모델).

무엇이 문제입니까? 나는 설득력있는 쿼리를 만들고 싶습니다. 즉, 에 가장 근접한 세 가지 제품을 선택할 수 있습니다. 가장 가까운 가격은입니다.

예를 들어 주 가격이 $ 40 인 제품을 보았지만 데이터베이스에는 $ 45, $ 38, $ 37, $ 50, $ 35와 같은 주요 가격의 제품이 있습니다.

$ 38 (2 달러 차이 만), 37 달러 (3 달러 차이 만), 45 달러 또는 35 달러 (5 달러 차이) 중 하나를 가장 가까운 가격으로 보여 주어야합니다.

나는 이것을 할 수 있음을 안다. 그러나 나의 해결책은 (내 머리 속에서) 각면에서 3 개의 제품을 (가격에서 위아래로) 잡아서 더 가까운 쪽을 확인하는 것이다. 가격.

나는 내 작품을 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의 일종으로 발생합니다. 여기서 foreach는 가격의 뺄셈을 확인하고 가장 가까운 것을 저장합니다.

나는 해결책을 좋아하지 않는다. 왜냐하면 제품 견해가 많이 방문 될 수 있기 때문에 시간을 할애 할 수 있기 때문이다. 예, 쿼리를 Redis 캐시 또는 다른 것으로 저장할 수 있지만 여전히 ...

이 세 제품을 더 쉽게 얻을 수있는 방법에 대해 더 잘 알고 있습니까?

감사

답변

0

Tzook의 답변 만들기 Laravel friendly.

Variant 모델에 함수를 추가하십시오.

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

이제이 기능은 더욱 역동적이어서 어디서나 사용할 수 있으며 사용하기가 훨씬 쉽습니다.

우리가 이미 제품을 알고 있기 때문에, 나는 실제로 게으른 로딩이 읽기 쉽고 이해하기 쉽다고 생각합니다.

+0

이것은 많은 도움이되었습니다. 현재 작동 중입니다. 감사합니다. – marwellt

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

내가 가장 가까운 항목을 얻을 쿼리의이 종류를 사용하는 당신에게 다음 maby eloquents는 ID의 발견이나 뭐 던졌다 만들 것입니다.

+0

답장을 보내 주셔서 감사합니다. – marwellt