CakePHP 3.6 Перевод и содержание

Мне нужно создать представление из записи, показывающей все переводы, и я также хочу добавить таблицы, показывающие прикрепленные записи из связанных моделей, к этой конкретной записи. Связанные модели не нужно переводить, их можно просто показать на текущем языке. Есть ли способ объединить «Содержать» с -> найти («переводы») ->? Или как лучше всего это сделать?

например Группа имеет много Ролей. Итак, я хочу показать группу со всеми переводами для 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);
}

Но мне интересно, нельзя ли объединить это в 1 find, если есть возможность использовать какой-то метод contains() с find('translations').


person Lucky    schedule 27.08.2018    source источник
comment
Вы можете добавить немного больше деталей о том, чего именно вы пытаетесь достичь (например, пример существующих и полученных данных), и с какой именно проблемой вы столкнулись.   -  person ndm    schedule 27.08.2018
comment
Я предполагаю, что вы столкнулись с проблемой при использовании contain() в первом запросе? Я все еще не уверен, каким должен быть результат, судя по первоначальному заявлению, вы хотите, чтобы защитные оболочки не были переведены, но обновление читается так, как будто вы, возможно, хотите, чтобы защитные оболочки также были переведены?   -  person ndm    schedule 27.08.2018
comment
Только основная запись (на скриншоте группа «Администраторы» должна иметь все переводы. Связанные записи могут отображаться только на 1 языке (выбранный язык. Таким образом, код, который вы видите выше, работает хорошо, я только хочу знать, есть ли может быть, лучший (Cake-) способ сделать это Итак, вкратце: можете ли вы использовать contains() с find('translations')?   -  person Lucky    schedule 27.08.2018
comment
Да можно, вы пробовали?   -  person ndm    schedule 27.08.2018
comment
Да, я пытался, но это не сработало. Можете ли вы сказать мне, как написать это для утреннего кода?   -  person Lucky    schedule 27.08.2018
comment
В этом нет ничего особенного, вы будете использовать его так же, как и с любым другим запросом. Если есть проблема, было бы хорошо, если бы вы подробно рассказали об этом, это то, к чему я пытался добраться.   -  person ndm    schedule 27.08.2018


Ответы (2)


Мы решили эту проблему с помощью этого, может быть, это может помочь

Создайте отдельную таблицу для переводов, например, 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']
    ]);
person Ved    schedule 28.08.2018

Я решил это так:

$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']);

Но по какой-то причине это не сработало для меня.

person Lucky    schedule 28.08.2018