2012-09-16 52 views
1

Yii的CMSYii的查詢與錯誤複合唯一鍵

我有表中「類別」,website_id +鏈接一個獨特的複合鍵,Yii的不支持此鍵,所以我寫了我自己的方法

一個網站有很多鏈接,每個鏈接都很獨特; 2個或更多網站可能具有相同的鏈接;因爲鏈接可能不是絕對的;

從一個鏈接數組中,我一次提取一個鏈接,如果類別模式適合,我想存儲url;

preg_match('/\/popular\/(.*?)\/1\.html/ims', $matches_website_url[1], $matches_url); 

if(count($matches_url) > 0 && 
    $this->avoid_duplicate_category($website['id'], $matches_url[1])) 
{ 
    $category = new Category(); 
    $category->website_id = $website['id']; 
    $category->link = $matches_url[0]; 
    $category->name = $matches_url[1]; 
    $category->urls = 0; 
    $category->update = time(); 
    $category->save(); 
} 

和方法

private function avoid_duplicate_category($website_id,$link) 
{ 
    $query_category = Yii::app()->db->createCommand("select * from `category` where `website_id`='.$website_id.' and `link`='.$link.';"); 

    $results = $query_category->queryAll(); 

    if(count($results)>0)return false; 
    else return true; 

} 

和錯誤返回:

CDbException 

CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'Cute' for key 'name'. The SQL statement executed was: INSERT INTO `category` (`website_id`, `link`, `name`, `urls`, `update`) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4) 

回答

3

我相信你應該能夠允許的Yii通過增加處理複合鍵下面給你的模型:

public function primaryKey() 
{ 
    return array('website_id','link'); 
} 

編輯,

對不起,誤讀您的問題!對於獨特的鍵(不是主要的),你可以嘗試這些擴展:

http://www.yiiframework.com/extension/composite-unique-key-validatable/

http://www.yiiframework.com/extension/unique-index-validator

+0

這不是PK,是聯合國神遊關鍵;我認爲我可以重命名該方法,並且yii會接受它;我希望;等到我嘗試; –

+0

public function rules(){ //注意:您只應該定義那些 //將接收用戶輸入的屬性的規則。 return array( ... array('website_id,link','primaryKey'), ... ); } public function primaryKey(){ return array('website_id','link'); } –

+0

不工作;我不知道如何寫它 –

0

這就是答案:

private function avoid_duplicate_category($website_id,$link) 
{ 
    $query = "select * from `category` where `website_id`=:website_id and `link`=:link;"; 

    $query_category = Yii::app()->db->createCommand($query); 

    $query_category->bindParam(':website_id', $website_id); 

    $query_category->bindParam(':link', $link); 

    $results = $query_category->queryAll(); 

    if(count($results)>0)return false; 
    else return true; 

}