Таблица Symfony i18n: способы получения запасного значения по умолчанию? - PullRequest
3 голосов
/ 24 января 2010

Я создаю таблицу названий городов в MySQL, содержащую около 10 тыс. Строк, которая будет таблицей Symfony i18n. В основном, культура по умолчанию - en_US, и каждый город в таблице изначально принадлежит этой культуре. Со временем я хотел бы добавить в таблицу только те города, которые могут иметь альтернативное название на другом языке, например "Лондон (en_US) / Лондры (es_ES)", без необходимости реплицировать все данные города для каждого язык в отдельных таблицах.

Теперь, насколько я понимаю, Symfony не будет автоматически выбирать запасное название города по умолчанию, если его перевода не существует. Поэтому мне нужно выработать решение для следующего:

Если перевод существует, выберите его .... если нет, выберите название города en_US по умолчанию.

Пока что кажется, что я должен использовать COALESCE. Однако, поскольку я не очень знаком с ним, мне интересно, есть ли какие-либо недостатки в его частом использовании? Я спрашиваю об этом, потому что мне нужно было бы включать его в каждый запрос города, что является очень частым действием на моем сайте.

Буду признателен за любые взгляды или даже предложения по улучшению работы. Благодаря.

Ответы [ 3 ]

5 голосов
/ 24 января 2010

Попробуйте что-то вроде этого:

$q = Doctrine_Query::create()
     ->from('Cities c')
     ->leftJoin('c.Translation ct WITH lang IN(?)', array(array('es_ES', 'en_US')))
     ->execute();
0 голосов
/ 29 июля 2010

Если вы храните доступные языки в другой таблице, вы можете сделать что-то вроде этого. Таким образом, он вернет имя культуры по умолчанию или, если оно равно 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();        
    }
  }
}
0 голосов
/ 29 января 2010

То, что вы также можете сделать, это перезаписать метод 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;
}

Конечно, по вашему запросу к базе данных вам придется каждый раз загружать оба перевода. Если вы показываете основное содержание на испанском языке, вам необходимо получить обе данные, как указано ранее Крозином.

...