Symfony1 如何使用symfony和doctrine对国际化的i18n表进行排序?

Symfony1 如何使用symfony和doctrine对国际化的i18n表进行排序?,symfony1,doctrine,internationalization,Symfony1,Doctrine,Internationalization,我想使用sfDoctrinePager显示国际化表中的记录列表。并不是所有的记录都被翻译成应用程序支持的所有语言,所以我必须为一些字段实现一个回退机制(通过重写Bar.class.php中的getFoo()函数,如本文另一篇文章中所解释的)。我对每种文化都有不同的后备列表。 在按字母顺序对记录进行排序之前,一切正常 我在SQL(Dql)级别对记录进行排序,方法是在查询中添加一个->orderBy('t.name'): $q = Doctrine::getTable('Foo')

我想使用sfDoctrinePager显示国际化表中的记录列表。并不是所有的记录都被翻译成应用程序支持的所有语言,所以我必须为一些字段实现一个回退机制(通过重写Bar.class.php中的getFoo()函数,如本文另一篇文章中所解释的)。我对每种文化都有不同的后备列表。 在按字母顺序对记录进行排序之前,一切正常

我在SQL(Dql)级别对记录进行排序,方法是在查询中添加一个->orderBy('t.name'):

    $q = Doctrine::getTable('Foo')
        ->createQuery('f')
        ->leftJoin('f.Translation t')
        ->orderBy('t.name')
$q = Doctrine::getTable('Foo')
    ->createQuery('f')
    ->leftJoin('f.Translation t')
    ->where('t.lang = ?', sfContext::getInstance()->getUser()->getCulture())
    ->orderBy('t.name')
但问题来了:不管活动区域性如何,列表都没有正确排序。 当我将翻译限制在活动文化中时,我会得到更好的结果,如下所示:

->leftJoin('f.Translation t WITH lang = ?', $request->getParameter('sf_culture');
那么,只要活动区域性的所有翻译都存在,排序就正确了。如果翻译不存在,并且我必须从回退语言中获取名称,则记录将显示在列表的最开始处(我理解这是因为当前区域性的值为null)。 我的问题是:是否有一个最佳实践可以让国际化字段(需要回退)与doctrine和sfDoctrinePager正确排序? 先谢谢你

  • 创建同时返回主语言和回退语言的DQL查询:
    ->innerJoin('f.Translation ft WITH ft.lang IN(?)、array(array('pl','en'))
  • 确保主语言在回退前已排序:
    ->orderBy('FIELD(ft.lang,“pl”,“en”)
  • 现在,您应该能够添加
    ->orderBy('ft.name')
    ,它应该可以按预期工作

  • 使用或传递寻呼机的查询。

    我支持Crozin的回答,尽管我对排序工作不正常感到惊讶(假设您在symfony规则下正确设置了i18n个表)


    在某些情况下,作为回退的替代方法,如果翻译并不总是存在,或者您无法或不愿意返回两个结果,并且如果翻译表中包含的数据量不是很大,您还可以在数据库中复制每种语言的数据,为这些字段编写翻译t它们可用于。这样,单一语言条件将始终返回结果-默认或翻译。就存储数据而言,这不是最干净的解决方案,但可能适合某些特定情况。

    在查询中使用区域性:

        $q = Doctrine::getTable('Foo')
            ->createQuery('f')
            ->leftJoin('f.Translation t')
            ->orderBy('t.name')
    
    $q = Doctrine::getTable('Foo')
        ->createQuery('f')
        ->leftJoin('f.Translation t')
        ->where('t.lang = ?', sfContext::getInstance()->getUser()->getCulture())
        ->orderBy('t.name')
    

    谢谢你的回答,但是使用你的方法,如果活动语言中没有可用的翻译,我将没有可用的回退。