我正在MySQL中构建一个城市名称表,大约有10K行作为Symfony i18n表。基本上,默认文化是en_US,表格中的每个城市最初都是这种文化。随着时间的推移,我想在表中添加那些可能使用不同语言的替代名称的城市,例如“London(en_US)/ Londres(es_ES)”,而不必为每个城市复制所有城市数据单独表格中的语言。
现在,根据我的理解,如果不存在翻译,Symfony将不会自动选择后备默认城市名称。所以我需要制定一个解决方案来执行以下操作:
如果存在翻译,请选择它....如果不存在,请选择默认的en_US城市名称。
到目前为止,我似乎应该使用COALESCE
。但是,由于我对它不是很熟悉,我想知道使用它是否有任何缺点?我问这个是因为我需要在每个城市查询中加入它,这在我的网站上是非常频繁的操作。
感谢任何观点,甚至建议以更好的方式做事。感谢。
答案 0 :(得分:5)
尝试这样的事情:
$q = Doctrine_Query::create()
->from('Cities c')
->leftJoin('c.Translation ct WITH lang IN(?)', array(array('es_ES', 'en_US')))
->execute();
答案 1 :(得分:0)
你还可以做的是覆盖城市模型中的de 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之前所指出的那样。
答案 2 :(得分: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();
}
}
}