2011-08-05 41 views
1

我有兩種產品和優惠。產品有一個提供。模型與如何避免使用產品hasOne提供的重複產品?

//Product model: 
hasOne 
    Offer 
    foreignKey => false 
    conditions => array(Product.productnumber = Offer.productnumber) // Just normal fields 

//Offer model: 
belongsTo 
    Product 

綁定可以有很多的優惠與相同Offer.productnumber和不同Offer.price。我想要做的是找到所有產品,以便只有一個報價出現與最便宜的Offer.price。但是現在,當我試圖這樣做時,我得到的產品編號與具有相同產品編號的產品數量一樣多。如何避免這種情況?

我也看到了這個:hasMany reduced to hasOne in CakePHP但沒有運氣與遏制。

只有(最簡單)選項獲得單獨的數組,然後將它們「手動」組合?

回答

1

產品有很多優惠。產品hasMany LowestOffer在關係條件數組中按照價格ASC和限制=> 1條款進行排序的訂單子句。

然後做一個包含的查找並將LowestOffer拉回來,當你想要一個最便宜的報價或拉回優惠當你想要他們所有。

+0

我想這可以工作。仍然我最終獲取兩個單獨的數組並手動合併它們。我感謝你的努力。 – Henri

1

如果你想要一個產品的許多優惠,那麼你必須使用hasMany。產品有許多優惠。

這就是您應該在模型中建立關係的方式。我的意思是,考慮一下,如果你的商店裏有一本書,而且它只能有一個報價,那沒有任何意義。

好了,現在,讓所有剛剛1報價書,我能想到是這樣的:

SELECT p.id FROM products p JOIN offers o ON(p.id=o.product_id) WHERE p.id IN (
    SELECT oo.product_id FROM offers oo GROUP BY oo.product_id WHERE SUM(oo.product_id)=1 
) 

試圖把在Model::find()語法,或者僅使用Model::query()方法。

編輯:

如果你想提供更大的價格。

SELECT p.id FROM products p JOIN offers o ON(p.id=o.product_id) WHERE p.id IN (
    SELECT oo.product_id FROM offers oo GROUP BY oo.product_id WHERE OO.id = MAX(oo.price) 
) 
+0

那你爲你的答案。有一個原因,我爲什麼不建模這種關係。我從csv填充offers-table,並且我不想爲保存到表格的每個Offer都查找Product.id。讓我澄清一下:我想要所有的產品,如果有相同產品編號的產品,我也想要那個,但只有最便宜的價格。我不想使用$ this-> Model-> query(); – Henri

+0

不明白亨利。這沒有意義。我的意思是,除了填充表格的方式之外,還有一些關係是可以的。如果你的產品只有一個報價,那麼你就錯了。不要試圖用技術來塑造真實感,做相反的事情,對技術進行建模以適應實際情況。 – santiagobasulto

+0

那麼好吧,如果產品hasMany提供我的產品 - > find('all')將返回具有相同產品編號的所有產品。但是之後我必須構建幾個foreach循環以在找到之後取消設置不必要的優惠。這也是相當不錯的解決方案。謝謝。但是如何在hasOne找到之後讓數組看起來像? '$ products [0] [Offer] - > $ products [Offer]' – Henri

相關問題