【问题标题】:Cake PHP automatically add id field to sql queryCake PHP 自动添加 id 字段到 sql 查询
【发布时间】:2014-06-13 13:53:13
【问题描述】:

我在 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 intermatte.error_messages AS 第 1 行的“ErrorMes”

SQL 查询:SELECT ErrorMessage.id, DISTINCT ErrorMessage. message FROM intermatte.error_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;

所以问题是,为什么 cake 会自动包含 id 字段,我如何告诉 cake 不要这样做?

我当然可以使用查询,但这并不“好”。 ;)

【问题讨论】:

    标签: php mysql sql cakephp distinct


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 2011-11-13
      • 2011-07-03
      相关资源
      最近更新 更多