简体   繁体   English

CakePHP 2.9连接查询返回错误的结果

[英]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

SQL Fiddle: http://sqlfiddle.com/#!9/7b4b0a/1 SQL小提琴: http ://sqlfiddle.com/#!9/7b4b0a/1

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方法复制此查询,但是

the result is returning empty 结果是空的

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: 我在您的代码中发现的一些问题:

  1. The array key for Join should be joins . Join的数组键应该是joins You have used join . 你使用过join

  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM