CakePHP подзапрос SQL в отношении HABTM - PullRequest
0 голосов
/ 04 августа 2010

Я хочу предложить похожие товары по тегам и отсортировать по наиболее подходящим.

связь модели HABTM между Product и Tag

class Product extends AppModel {
//..
var $hasAndBelongsToMany = array("Tag");
//..
}

и наоборот в модели Tag. также имя объединенной таблицы "products_tags".

Например.

//just sample of Product contain Tag data
$products[0]['Tag'] = array('touch', 'phone', '3G', 'apple'); //iPhone
$products[1]['Tag'] = array('phone', '3G', 'BB'); //BB
$products[2]['Tag'] = array('touch', '3G', 'apple'); //iPad
$products[3]['Tag'] = array('3G', 'air card'); //3G air card

в этом примере наиболее похожи на iPhone сортировки по приоритету:

  1. ipad (найдено в 3 тегах)
  2. BB (найдено в 2 тегах)
  3. Aircard (только 1 соответствует)

Как Cake использует Model find () для получения подзапроса следующим образом:

SELECT DISTINCT (product_id) AS id, (
/* sub-query counting same tags*/
SELECT COUNT(*) FROM tags as Tag
LEFT JOIN products_tags AS ProductTag ON ( Tag.id = ProductTag.tag_id )
WHERE product_id = id
AND Tag.name IN ( 'touch', 'phone', '3G', 'apple' )

) AS priority /*this is weight count by how many same tags*/
FROM  `tags` as Tag
LEFT JOIN products_tags AS ProductTag ON ( Tag.id = ProductTag.tag_id )
WHERE Tag.name
IN ( 'touch', 'phone', '3G', 'apple' ) 
ORDER BY priority DESC

SQL-запрос выше возвращает именно то, что мне нужно. но я не могу найти способ разбора параметров в методе AppModel-> find () CakePHP.

1 Ответ

0 голосов
/ 04 августа 2010

Если в результате этого sql не используется разбиение на страницы (при условии, что связанные продукты на обычной веб-странице содержат 3-5 записей), почему бы вместо этого не использовать этот сложный SQL?

т.е. создайте функцию relatedProducts () в вашей модели Product

затем используйте $ this-> query ($ sql)

пример кода будет:

class Product extends AppModel {
  //..
  var $hasAndBelongsToMany = array("Tag");
  //..
  function relatedProducts($parameters){
    $sql = "select..... where ....$parameters...";
    return $this->query($sql);
  }
}

Тогда вы можете использовать его в контроллере по

$this->Product->relatedProducts($some_parameters);
...