CakePHP bindTranslation()仅返回当前语言环境的记录

时间:2014-08-16 12:47:47

标签: cakephp model multilingual

我想从原始表(类别)中检索其翻译表(category_i18ns)的所有记录。我想要表格类别中的所有记录,无论我当前的区域设置如何。

目前,当我使用bindTranslation()时,它会返回转换表中的所有记录,但仅返回与当前区域设置匹配的记录(来自表类别)。

以下是一个例子:

表category_i18ns

中的记录
id,created,modified,locale,model,foreign_key,field,content
1,"2014-08-15 17:08:26","2014-08-15 17:08:26",eng,Category,1,name,Entertainment
2,"2014-08-15 17:08:26","2014-08-15 17:08:26",eng,Category,1,url_name,entertainment
3,"2014-08-15 17:09:47","2014-08-15 17:09:47",eng,Category,2,name,Location
4,"2014-08-15 17:09:47","2014-08-15 17:09:47",eng,Category,2,url_name,location
5,"2014-08-15 17:12:11","2014-08-15 17:12:11",nld,Category,2,name,Locatie
6,"2014-08-15 17:12:11","2014-08-15 17:12:11",nld,Category,2,url_name,locatie
7,"2014-08-15 17:12:11","2014-08-15 17:12:11",nld,Category,3,name,Vervoer
8,"2014-08-15 17:12:11","2014-08-15 17:12:11",nld,Category,3,url_name,vervoer
9,"2014-08-15 17:12:11","2014-08-15 17:12:11",deu,Category,1,name,Unterhaltung
10,"2014-08-15 17:12:11","2014-08-15 17:12:11",deu,Category,1,url_name,unterhaltung
11,"2014-08-15 17:12:11","2014-08-15 17:12:11",nld,Category,1,name,Vermaak
12,"2014-08-15 17:12:11","2014-08-15 17:12:11",nld,Category,1,url_name,vermaak
13,"2014-08-15 17:12:11","2014-08-15 17:12:11",deu,Category,2,name,Lage
14,"2014-08-15 17:12:11","2014-08-15 17:12:11",deu,Category,2,url_name,lage
15,"2014-08-15 17:12:11","2014-08-15 17:12:11",eng,Category,3,name,Transport
16,"2014-08-15 17:12:11","2014-08-15 17:12:11",eng,Category,3,url_name,transport
17,"2014-08-15 17:12:11","2014-08-15 17:12:11",nld,Category,4,name,"Eten & Drinken"
18,"2014-08-15 17:12:11","2014-08-15 17:12:11",nld,Category,4,url_name,eten-drinken

表类别中的记录

id,created,modified,total_services
1,"2014-08-15 17:08:26","2014-08-15 17:08:26",0
2,"2014-08-15 17:09:47","2014-08-15 17:09:47",0
3,"2014-08-15 17:12:11","2014-08-15 17:12:11",0
4,"2014-08-15 17:12:11","2014-08-15 17:12:11",0

CategoriesController.php

$query2 = array(
    'recursive' => 1
);

$this->Category->bindTranslation(array(
    'name' => 'name_i18n', 
    'url_name' => 'url_name_i18n'
));

$categories = $this->Category->find(
    'all',
    $query2
);

debug($categories);

$ categories

的结果
array(
    (int) 0 => array(
        'Category' => array(
            'id' => '1',
            'created' => '2014-08-15 17:08:26',
            'modified' => '2014-08-15 17:08:26',
            'total_services' => '0',
            'locale' => 'eng',
            'name' => 'Entertainment',
            'url_name' => 'entertainment'
        ),
        'Service' => array(),
        'name_i18n' => array(
            (int) 0 => array(
                'id' => '1',
                'created' => '2014-08-15 17:08:26',
                'modified' => '2014-08-15 17:08:26',
                'locale' => 'eng',
                'model' => 'Category',
                'foreign_key' => '1',
                'field' => 'name',
                'content' => 'Entertainment'
            ),
            (int) 1 => array(
                'id' => '9',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'deu',
                'model' => 'Category',
                'foreign_key' => '1',
                'field' => 'name',
                'content' => 'Unterhaltung'
            ),
            (int) 2 => array(
                'id' => '11',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'nld',
                'model' => 'Category',
                'foreign_key' => '1',
                'field' => 'name',
                'content' => 'Vermaak'
            )
        ),
        'url_name_i18n' => array(
            (int) 0 => array(
                'id' => '2',
                'created' => '2014-08-15 17:08:26',
                'modified' => '2014-08-15 17:08:26',
                'locale' => 'eng',
                'model' => 'Category',
                'foreign_key' => '1',
                'field' => 'url_name',
                'content' => 'entertainment'
            ),
            (int) 1 => array(
                'id' => '10',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'deu',
                'model' => 'Category',
                'foreign_key' => '1',
                'field' => 'url_name',
                'content' => 'unterhaltung'
            ),
            (int) 2 => array(
                'id' => '12',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'nld',
                'model' => 'Category',
                'foreign_key' => '1',
                'field' => 'url_name',
                'content' => 'vermaak'
            )
        )
    ),
    (int) 1 => array(
        'Category' => array(
            'id' => '2',
            'created' => '2014-08-15 17:09:47',
            'modified' => '2014-08-15 17:09:47',
            'total_services' => '0',
            'locale' => 'eng',
            'name' => 'Location',
            'url_name' => 'location'
        ),
        'Service' => array(),
        'name_i18n' => array(
            (int) 0 => array(
                'id' => '3',
                'created' => '2014-08-15 17:09:47',
                'modified' => '2014-08-15 17:09:47',
                'locale' => 'eng',
                'model' => 'Category',
                'foreign_key' => '2',
                'field' => 'name',
                'content' => 'Location'
            ),
            (int) 1 => array(
                'id' => '5',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'nld',
                'model' => 'Category',
                'foreign_key' => '2',
                'field' => 'name',
                'content' => 'Locatie'
            ),
            (int) 2 => array(
                'id' => '13',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'deu',
                'model' => 'Category',
                'foreign_key' => '2',
                'field' => 'name',
                'content' => 'Lage'
            )
        ),
        'url_name_i18n' => array(
            (int) 0 => array(
                'id' => '4',
                'created' => '2014-08-15 17:09:47',
                'modified' => '2014-08-15 17:09:47',
                'locale' => 'eng',
                'model' => 'Category',
                'foreign_key' => '2',
                'field' => 'url_name',
                'content' => 'location'
            ),
            (int) 1 => array(
                'id' => '6',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'nld',
                'model' => 'Category',
                'foreign_key' => '2',
                'field' => 'url_name',
                'content' => 'locatie'
            ),
            (int) 2 => array(
                'id' => '14',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'deu',
                'model' => 'Category',
                'foreign_key' => '2',
                'field' => 'url_name',
                'content' => 'lage'
            )
        )
    ),
    (int) 2 => array(
        'Category' => array(
            'id' => '3',
            'created' => '2014-08-15 17:12:11',
            'modified' => '2014-08-15 17:12:11',
            'total_services' => '0',
            'locale' => 'eng',
            'name' => 'Transport',
            'url_name' => 'transport'
        ),
        'Service' => array(),
        'name_i18n' => array(
            (int) 0 => array(
                'id' => '7',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'nld',
                'model' => 'Category',
                'foreign_key' => '3',
                'field' => 'name',
                'content' => 'Vervoer'
            ),
            (int) 1 => array(
                'id' => '15',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'eng',
                'model' => 'Category',
                'foreign_key' => '3',
                'field' => 'name',
                'content' => 'Transport'
            )
        ),
        'url_name_i18n' => array(
            (int) 0 => array(
                'id' => '8',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'nld',
                'model' => 'Category',
                'foreign_key' => '3',
                'field' => 'url_name',
                'content' => 'vervoer'
            ),
            (int) 1 => array(
                'id' => '16',
                'created' => '2014-08-15 17:12:11',
                'modified' => '2014-08-15 17:12:11',
                'locale' => 'eng',
                'model' => 'Category',
                'foreign_key' => '3',
                'field' => 'url_name',
                'content' => 'transport'
            )
        )
    )
)

如您所见,结果($ categories)中不包含表category_18ns中id为17和18,表类别中为4的记录。无论当前的语言环境如何,我都希望包含它。

1 个答案:

答案 0 :(得分:0)

现在,我的案例有一个快速而肮脏的解决方案。我通过自己的sql语句检索数据。但我现在这不是一个保存解决方案。因此,如果某人有更好(更安全)的解决方案,我想知道。

我目前快速而肮脏的解决方案:

Category.php(模型)

/**
 * Returns all categories with all translated fields, independent of locale setting.
 */
public function getAllTranslations() {

    $result = null;
    $queryResults = $this->query('SELECT categories.*, category_i18ns.* FROM categories INNER JOIN category_i18ns ON category_i18ns.foreign_key = categories.id;');

    foreach($queryResults as $queryResult) {

        $locale = $queryResult['category_i18ns']['locale'];
        $field = $queryResult['category_i18ns']['field'];
        $content = $queryResult['category_i18ns']['content'];
        $categoryId = $queryResult['categories']['id'];

        if(!isset($result[$categoryId])) {
            $result[$categoryId] = $queryResult['categories'];
            $result[$categoryId][$field][$locale] = $content;
        } else {
            $result[$categoryId][$field][$locale] = $content;
        }

    }

    return $result;

}