Как избежать дублирования продуктов с предложением Product hasOne? - PullRequest
1 голос
/ 05 августа 2011

У меня есть две модели продуктов и предложений. Продукты имеют одно предложение. Модели связаны с

//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 уменьшен до hasOne в CakePHP Но не повезло с содержимым.

Является ли единственным (самым простым) вариантом получить отдельные массивы и затем объединить их «вручную»?

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Продукт имеет много предложений.Продукт hasMany LowestOffer с предложением заказа в массиве условий отношений, отсортированным по цене ASC, и предложением limit => 1.

Затем сделайте поиск с помощьюableable и отведите LowestOffer обратно, если вы хотите только одно самое дешевое предложение, или откатите предложения, когда вы хотите их все.

1 голос
/ 05 августа 2011

Если вы хотите много предложений для одного продукта, то вы должны использовать 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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...