2014-06-21 23 views
1

我的問題與this question(試圖使用CDbCriteria的列名爲key,它是reserved word in MySQL)中的問題完全相同。然而,provided solution構造列名爲MySQL保留字的CDbCriteria

$criteria = new CDbCriteria; 

$criteria->condition = 't.key=:key'; 
$criteria->params = array(':key'=>$this->key); 
$criteria->compare('position', $this->position); 
$criteria->compare('dictionary', $this->dictionary); 

只對我有效。我不再例外,但搜索僅適用於key列。所有其他都將被忽略(如果設置了key,僅在搜索時僅考慮此值,如果未設置 - 總是返回空結果集)。

我錯過了什麼?我應該如何構造CDbCriteria查詢,當我的表格包含作爲列名稱的存儲單詞時,搜索也會尊重所有其他(非保留)列,而不僅僅是這一列?

回答

1

CDbCriteria::compare()只有在設置了參數時纔會添加條件,否則不會採取任何操作。 See Here

$criteria->condition = 't.key=:key'; 
$criteria->params = array(':key'=>$this->key); 

然而,無論是否設置了密鑰,該邏輯都起作用。所以基本上你的病情變得

SELECT * FROM `some_table` t WHERE t.key =:key 

即使密鑰值是空白導致查詢斷裂時的關鍵屬性未設置

所以,如果你修改你的聲明是這樣那麼它的工作

if(isset($this->key){ 
    $criteria->condition = 't.key=:key'; 
    $criteria->params = array(':key'=>$this->key); 
} 

在這種情況下,只有在設置了鍵屬性時纔會激活此語句,否則將被忽略,並且您的查詢不會中斷

+1

謝謝您的回覆!我接受你的答案,因爲沒有其他答案。然而,我必須指出,我沒有使用(也沒有測試過)你的解決方案,因爲我發現(在Yii論壇上)[這個問題更容易解決](http://www.yiiframework.com/forum/ index.php/topic/55459-construct-cdbcriteria-with-column-name-as-mysql-reserved-words/page__view__findpost__p__253543) - '$ criteria-> compare('t.key',$ this-> key); '。工作得很好。 – trejder

+0

謝謝:)它的工作原理,我有秩序關鍵字類似的問題,這也是一種做法,明確使用表名稱也有效 – Manquer