[英]CakePHP 2.9 join query returning wrong result
我正在使用以下(工作)MySQL查詢來獲取collection_keyword的所有collection_items的計數
SELECT ck.id
, ck.working_title
, count(*) as matches
FROM collection_keywords ck
JOIN collection_keywords_collection_items ckci
ON ckci.collection_keyword_id = ck.id
JOIN nl_collection_items nci
ON nci.id = ckci.collection_item_id
GROUP
BY ck.id
返回以下信息
+----+---------------+---------+
| id | working_title | matches |
+----+---------------+---------+
| 1 | First Title | 5 |
| 2 | Second Title | 10 |
| 3 | Third Title | 15 |
+----+---------------+---------+
我正在嘗試使用CakePHP 2.9。使用join方法復制此查詢,但是
這是我的CakePHP代碼
$collectionKeywords = $this->CollectionKeyword->find('all', array(
'contain' => array(),
'fields' => array('CollectionKeyword.id, CollectionKeyword.working_title', 'count(*) AS matches'),
'joins' => array(
array(
'table' => 'collection_keywords_collection_items',
'type' => 'INNER',
'conditions' => array(
'collection_keywords_collection_items.collection_keyword_id' => 'CollectionKeyword.id'
)
)
),
'group' => 'CollectionKeyword.id',
));
關系定義如下
class CollectionKeyword extends PluginCollectionKeyword
{
public $hasAndBelongsToMany = array(
'CollectionItem' => array(
'className' => 'CollectionItem',
'joinTable' => 'collection_keywords_collection_items',
'foreignKey' => 'collection_keyword_id',
'associationForeignKey' => 'collection_item_id',
)
);
}
和CollectionItem的關系
class CollectionItem extends PluginCollectionItem
{
public $hasAndBelongsToMany = array(
'CollectionKeyword' => array(
'className' => 'CollectionKeyword',
'joinTable' => 'collection_keywords_collection_items',
'foreignKey' => 'collection_item_id',
'associationForeignKey' => 'collection_keyword_id',
),
);
}
我在您的代碼中發現的一些問題:
Join的數組鍵應該是joins
。 你使用過join
。
缺少第二次內部連接的條件。
這是有效的代碼。
$collectionKeywords = $this->CollectionKeyword->find('all', array(
'contain' => array(),
'fields' => array('CollectionKeyword.id, CollectionKeyword.working_title', 'count(*) AS matches'),
'recursive' => -1,
'joins' => array(
array(
'table' => 'collection_keywords_collection_items',
'type' => 'INNER',
'conditions' => array(
"collection_keywords_collection_items.collection_keyword_id = CollectionKeyword`.id"
)
),
array(
'table' => 'collection_items',
'type' => 'INNER',
'conditions' => array(
"collection_items.id = collection_keywords_collection_items.collection_item_id"
)
),
),
'group' => 'CollectionKeyword.id',
));
它產生以下查詢
SELECT CollectionKeyword.id, CollectionKeyword.working_title, count(*) AS matches FROM `collection_keywords` AS `CollectionKeyword` INNER JOIN `collection_keywords_collection_items` ON (`collection_keywords_collection_items`.`collection_keyword_id` = `CollectionKeyword`.`id`) INNER JOIN `collection_items` ON (`collection_items`.`id` = `collection_keywords_collection_items`.`collection_item_id`) WHERE 1 = 1 GROUP BY `CollectionKeyword`.`id`
根據您使用的Cakephp版本,您可以驗證使用此代碼運行的上次查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.