2014-06-13 27 views
0

我在Cake 2.1中有以下代碼。我嘗試獲取唯一字符串消息的列表,刪除所有重複項。蛋糕PHP自動添加ID字段到SQL查詢

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

哪產生以下錯誤:

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DISTINCT ErrorMessage. message FROM intermatte . error_messages AS `ErrorMes' at line 1

SQL Query: 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; 

所以現在的問題是,爲什麼蛋糕自動包含id字段,我該如何告訴蛋糕不要這樣做?

我當然可以使用查詢,但這不是'好'。 ;)

回答

0

是,CakePHP會做到這一點,你可以做的是使用GROUP BY子句來解決這個問題,

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

大,謝謝!在這種情況下完美工作。 – Snorvarg

0

蛋糕總是包含在「名單」的查詢ID,除非你指定兩個字段在查詢的「字段」部分。如果運行不帶任何領域的規範,查詢,默認情況下,返回的結果將是這種格式:

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

(除非您覆蓋在模型的默認顯示名)。

在查詢中指定兩個不包含id的字段,例如

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

這將在格式返回一個數組:

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

只得到唯一的消息,使用GROUP BY:

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

謝謝你gazareth,我也發現了一個類似的帖子在這裏: http://stackoverflow.com/questions/1718482/using-distinct-in-a-cakephp-find-function/1718614#1718614 – Snorvarg

+0

這個答案談到使用設置類以刪除重複項。請注意,最好使用Hash類而不是Set - 它更快更好。 http://book.cakephp.org/2.0/en/core-utility-libraries/hash.html – gazareth