3

我正在用MySQL構建一個大約10K行的城市名稱表作爲Symfony i18n表。基本上,默認文化是en_US,表中的每個城市都是這種文化的起源。隨着時間的推移,我只想在表格中添加可能具有其他語言替代名稱的城市,例如「London(en_US)/ Londres(es_ES)」,而不必複製每個城市的所有城市數據語言在單獨的表格中。Symfony i18n表:獲取回退默認值的方法?

現在,從我的理解,Symfony的不會自動挑選後備默認城市的名字如果翻譯因爲它不存在。所以,我需要制定一個解決方案,做到以下幾點:

如果存在翻譯,選擇它....如果沒有,選擇默認EN_US城市名稱。

到目前爲止,似乎我應該用COALESCE。然而,由於我對它不是很熟悉,我想知道是否有任何缺點使用它很多?我問這是因爲我需要在每個城市查詢中包含它,這是我網站上非常頻繁的操作。

將是任何意見,或以更好的方式做事甚至建議表示感謝。謝謝。

+0

您正在使用什麼ORM? – Crozin 2010-01-24 16:23:57

+0

我在使用Doctrine – Tom 2010-01-24 16:24:41

回答

5

嘗試這樣:

$q = Doctrine_Query::create() 
    ->from('Cities c') 
    ->leftJoin('c.Translation ct WITH lang IN(?)', array(array('es_ES', 'en_US'))) 
    ->execute(); 
+0

謝謝,我會測試一下。 – Tom 2010-01-24 16:53:06

+0

最終沒有用完,但它給了我一個主意,謝謝。 – Tom 2010-01-24 18:51:59

+2

你能編輯你的問題併發布答案嗎?它可以幫助其他人。 – Crozin 2010-01-24 19:02:51

0

你也可以做的是在城市覆蓋模型去getName()方法(或創建一個新的,像getNameWithDefault())。 這樣的事情也可以工作:

public function getName() 
{ 
    // Assuming that $this->name will give us the data for the current locale 
    return ($this->name == NULL)? $this->Translation->en_US->name: $this->name; 
} 

在您的數據庫查詢,當然,你必須每次加載兩個翻譯。如果您使用西班牙文顯示主要內容,則需要獲取Crozin之前指出的兩種數據。

0

如果可用語言存儲在不同的表,你可以做這樣的事情。所以它會返回默認的文化名稱,或者如果它是NULL,它會返回第一個將被發現的。

public function getName($culture = null) 
{ 
    if($this->getCurrentCitiesI18n($culture)->getName() != NULL) 
    return $this->getCurrentCitiesI18n($culture)->getName(); 
    else 
    { 
    foreach (LanguagesPeer::getAvailablelanguages() as $lang) 
    { 
     if($this->getCurrentCitiesI18n($lang->getIsoCode())->getName() != NULL) 
     return $this->getCurrentCitiesI18n($lang->getIsoCode())->getName();   
    } 
    } 
}