【问题标题】:CakePHP 3.x translation behavior: read all translations with "get"CakePHP 3.x 翻译行为:使用“get”读取所有翻译
【发布时间】:2020-07-09 11:59:28
【问题描述】:

食谱描述了如何使用retrieve all translations for an entity,但它使用的是find('translations')。它还讨论了如何retrieve all translations for associations。我希望使用get 和包含功能来混合这些,因为我已经在同时读取相关记录了。

要加载一个联赛和所有相关的部门及其翻译,这很有效:

$league = $this->Leagues->get($id, ['contain' => [
    'Divisions' => [
        'queryBuilder' => function (Query $q) {
            return $q->find('translations');
        },
    ],
]]);

到目前为止,一切都很好。但我还需要加载联赛的所有翻译。这有效:

$league = $this->Leagues->find('translations')->where(['Leagues.id' => $id])->contain([
    'Divisions' => [
        'queryBuilder' => function (Query $q) {
            return $q->find('translations');
        },
    ],
])->first();

但它与我用于读取单个实体的所有其他代码不一致,该代码始终使用get。我试过这个:

$league = $this->Leagues->get($id, ['contain' => [
    'queryBuilder' => function (Query $q) {
        return $q->find('translations');
    },
    'Divisions' => [
        'queryBuilder' => function (Query $q) {
            return $q->find('translations');
        },
    ],
]])->first();

但它会导致来自EagerLoader::normalized 的“错误:无法使用闭包类型的对象作为数组”。

我是否遗漏了一些明显(或不那么明显?)的东西,或者这不是一个受支持的选项?

【问题讨论】:

    标签: cakephp internationalization cakephp-3.8


    【解决方案1】:

    queryBuilder 是实际收容的一个选项,您不能将其用作顶级密钥。

    您正在寻找的是get() 方法的finder 选项:

    $league = $this->Leagues
        ->get($id, [
            'finder' => 'translations',
            'contain' => [
                'Divisions' => [
                    'queryBuilder' => function (Query $q) {
                        return $q->find('translations');
                    },
                ],
            ]
        ])
        ->first();
    

    另见

    【讨论】:

    • 如此简单!谢谢。我什至没有考虑到get 可能有finder 选项。
    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2016-11-05
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多