CakePHP 3.6 翻译和包含

CakePHP 3.6 Translate and Contain

我需要从显示所有翻译的记录构建视图,并且我还想添加表以显示关联模型到该特定记录的附加记录。关联的模型无需翻译,只需以当前语言显示即可。 有没有办法将 'Contain' 与 ->find('translations')-> 结合起来? 或者这样做的最佳做法是什么?

f.e。一个组有很多角色。因此,我想向该组显示 Groups.name 的所有翻译以及属于该组的所有角色的列表。

现在我用单独的发现做到了:

public function view($id = null)
{
    $group = $this->Groups->find('translations')->where(['Groups.id' => $id])->first();
    $this->set('group', $group);
    // related Roles
    $related_roles = $this->Groups->Roles->find('all', [
        'conditions' => ['Roles.group_id' => $id]
    ]);
    $this->set('related_roles', $related_roles);
}

但我想知道是否有可能将某种 contain() 与 find('translations') 结合使用。

我是这样解决的:

$group = $this->Groups
            ->find('translations')
            ->where(['Groups.id' => $id])
            ->contain(['Roles', 'Users'])
            ->first();

在我尝试之前,手册中是这样的:

$group = $this->Groups
            ->find('translations')
            ->where(['Groups.id' => $id])
            ->first();
$group->contain(['Roles', 'Users']);

但无论出于何种原因,这对我来说都不起作用。

我们已经用这个解决了这个问题,也许这个可以帮助

为翻译创建一个单独的 table,即 groups_i18n https://book.cakephp.org/3.0/en/orm/behaviors/translate.html#using-a-separate-translations-table

现在在 Entity/Group 中添加行。php

protected $_accessible = [
    //other columns
    'name_translation' => true,
    '_i18n' => true,
    '_translations' => true
];

现在 GroupsTable.php,添加行为

$this->addBehavior('Translate', [
        'fields' => ['name'],
        'translationTable' => 'GroupsI18n'
    ]);

现在 GroupsController.php

$group = $this->Groups->get($id, [
        'contain' => ['Roles', 'Groups_name_translation', 'GroupsI18n']
    ]);