[英]CakePHP 2.9 join query returning wrong result
I'm using the following (working) MySQL query to get a count of all the collection_items for a collection_keyword 我正在使用以下(工作)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
Which returns the following information 返回以下信息
+----+---------------+---------+
| id | working_title | matches |
+----+---------------+---------+
| 1 | First Title | 5 |
| 2 | Second Title | 10 |
| 3 | Third Title | 15 |
+----+---------------+---------+
I'm trying to replicate this query using CakePHP 2.9., using the join method but 我正在尝试使用CakePHP 2.9。使用join方法复制此查询,但是
This is my CakePHP code 这是我的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',
));
The relations are defined as follows 关系定义如下
class CollectionKeyword extends PluginCollectionKeyword
{
public $hasAndBelongsToMany = array(
'CollectionItem' => array(
'className' => 'CollectionItem',
'joinTable' => 'collection_keywords_collection_items',
'foreignKey' => 'collection_keyword_id',
'associationForeignKey' => 'collection_item_id',
)
);
}
And the CollectionItem relation 和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',
),
);
}
A few issues I found in your code: 我在您的代码中发现的一些问题:
The array key for Join should be joins
. Join的数组键应该是joins
。 You have used join
. 你使用过join
。
The condition for 2nd Inner Join is missing. 缺少第二次内部连接的条件。
Here is the code that worked. 这是有效的代码。
$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',
));
It produces the below query 它产生以下查询
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`
Depending upon the Cakephp Version that you are using, you can verify the Last Query which ran by using this code . 根据您使用的Cakephp版本,您可以验证使用此代码运行的上次查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.