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

标签 php mysql cakephp orm

我正在使用以下(有效的)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

返回以下信息

+----+---------------+---------+
| 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',
        ),

    );
}

最佳答案

我在您的代码中发现的一些问题:

  1. Join 的数组键应该是joins。您已经使用了join

  2. 缺少第二个内部连接的条件。

这是有效的代码。

 $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 版本,您可以使用 code 验证运行的最后一个查询。 .

关于php - CakePHP 2.9 连接查询返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57568304/

相关文章:

php - 如何在 facebook graph API 的描述中添加换行符或回车符

php - 连接到第二个数据库在 CodeIgniter 中不起作用

php - Laravel 中的 destroy() 和 delete() 方法有什么区别?

php - 使用 php mysql 计算并显示列中的每个重复值

php - cakephp3中如何转义mysql数据库名称以防止sql注入(inject)?

forms - 在模型的beforeSave方法中从表单获取数据

php - 非持久性 pg 连接

php - 如何使用 PHP 在动态生成的 MS Excel 文件中插入/嵌入图像?

mysql - 将 Laravel 项目连接到在 CPanel 上创建的远程 MySQL

.htaccess - CakePHP 和 VirtualDocumentRoot 问题