Cake PHP自动将id字段添加到sql查询中

时间:2014-06-13 13:53:14

标签: php mysql sql cakephp distinct

我在cake php 2.1中有以下代码。我尝试获取唯一字符串消息的列表,删除所有重复项。

$this->loadModel('ErrorMessage');
$this->ErrorMessage->recursive = -1;
$error_messages = $this->ErrorMessage->find('list', 
  array(
    'fields' => array('DISTINCT message'),
  )
);

产生以下错误:

  

错误:SQLSTATE [42000]:语法错误或访问冲突:1064您   您的SQL语法有错误;检查对应的手册   您的MySQL服务器版本,以便在'DISTINCT附近使用正确的语法   ErrorMessage. message FROM intermatteerror_messages AS   第1行的“ErrorMes”

     

SQL查询:SELECT ErrorMessageid,DISTINCT ErrorMessage. message FROM intermatteerror_messages AS ErrorMessage WHERE 1   = 1

有趣的部分是在查询中产生的; Cake已自动包含id字段!

我单独测试查询,它产生预期的结果:(唯一字符串列表)

SELECT DISTINCT message FROM error_messages;

以下是创建表供参考:

CREATE TABLE `error_messages` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `message` MEDIUMTEXT NULL COLLATE 'utf8_unicode_ci',
    `figure` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `created` DATETIME NULL DEFAULT NULL,
    `modified` DATETIME NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT;

所以问题是,为什么蛋糕自动包含id字段,我怎么能告诉蛋糕不要这样做?

我当然可以使用查询,但这不是'好'。 ;)

2 个答案:

答案 0 :(得分:0)

是的,CAKEPHP会这样做,你可以做的是使用GROUP BY子句来克服这个问题,

$error_messages = $this->ErrorMessage->find('list', array(
                                                'fields'=>'message',
                                                'group' => 'message'));

答案 1 :(得分:0)

Cake会始终将ID包含在'列表中。查询,除非您在'字段中指定两个字段'部分查询。如果在没有任何字段规范的情况下运行该查询,则默认情况下返回的结果将采用以下格式:

array(
    'Model.id' => 'Model.name'
)

(除非您已覆盖模型中的默认displayName。)

在查询中指定两个不包含id的字段,例如

'fields' => array('ErrorMessage.message', 'ErrorMessage.message')

这将返回格式为:

的数组
array(
    'Errormessage.message' => 'ErrorMessage.message'
)

要仅获取唯一消息,请使用GROUP BY:

'group' => array('ErrorMessage.message')