3

Symfony i18n 테이블로 약 10K 행의 MySQL에 도시 이름 테이블을 구축하고 있습니다. 기본적으로 기본 문화는 en_US이며 테이블의 모든 도시는 처음에는이 문화권에 속합니다. 시간이 지남에 따라 "London (en_US)/Londres (es_ES)"와 같이 다른 언어로 된 대체 이름이있는 도시 만 테이블에 추가 할 수 있습니다. 각 도시 데이터를 모두 복제하지 않아도됩니다. 언어 별표.Symfony i18n table : 대체 대체 기본값을 얻는 방법은 무엇입니까?

이제 Symfony는 번역이 없으면 자동으로 폴백 기본 도시 이름을 선택하지 않습니다. 따라서 다음을 수행하는 솔루션을 만들어야합니다.

번역이 있으면 선택하고, 그렇지 않으면 기본 en_US 도시 이름을 선택하십시오.

지금까지 COALESCE을 사용해야하는 것으로 보입니다. 그러나, 나는 그것에 익숙하지 않기 때문에, 그것을 많이 사용하는 데 어떤 단점이 있는지 궁금합니다. 나는 내가 사이트에서 매우 빈번한 행동 인 모든 도시 쿼리를 포함시켜야하기 때문에 이것을 묻고있다.

모든 의견에 대해 감사 드리며 더 나은 방법으로 일하기를 제안합니다. 감사. 이 같은

+0

어떤 ORM을 사용하고 있습니까? – Crozin

+0

Doctrine을 사용하고 있습니다. – Tom

답변

5

시도 뭔가 :

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

고맙습니다. – Tom

+0

정확히 사용하지 않았지만 아이디어를주었습니다. 감사합니다. – Tom

+2

질문을 편집하고 답변을 게시 할 수 있습니까? 그것은 다른 사람들을 도울 수 있습니다. – Crozin

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();   
    } 
    } 
} 
관련 문제