Cakephp查找(';列出';)并转换行为

Cakephp查找(';列出';)并转换行为,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,我使用的是CakePHP3 我有一张帐目表。每个帐户都属于一个国家。Countries表使用Translate行为进行国际化,因此它可以存储每种语言的国家名称 class CountriesTable extends Table { public function initialize(array $config) { $this->table('countries'); $this->display

我使用的是CakePHP3

我有一张帐目表。每个帐户都属于一个国家。Countries表使用Translate行为进行国际化,因此它可以存储每种语言的国家名称

     class CountriesTable extends Table
     {
        public function initialize(array $config)
        {
        $this->table('countries');
        $this->displayField('name');
        $this->primaryKey('id');
        $this->addBehavior('Translate', ['fields' => ['name']]);
        }
注意,“name”字段是通过Translate行为国际化的,因此它不在countries表中

然后在AccountsController中,我想获得使用活动语言的国家/地区列表:

....
$countries = $this->Accounts->Countries->find('list', ['limit' => 200]);
.....
问题是它没有按照预期从i18n表中获取翻译。我已经为internationalized countries表编写了维护操作代码,一切正常,但是这个简单的
find('list')
不起作用

还有一个细节:在Mysql日志中,我看到它启动了这个查询。请注意,国家/地区表只有两个字段:idcode,但显示字段是name

SELECT Countries.id AS `Countries__id`, Countries.code AS `Countries__code` FROM countries Countries LIMIT 200

顺便说一句,从2.x切换到3.x变得非常困难

经过大量调查,我发现了这个问题。如果是我的情况,accounts表不是国际化的,而是相关的表国家

问题是我没有在Accounts controller中设置区域设置。将这条线放在发现之前后,一切正常:

I18n::locale('spa');
因此,我想如果不使用I18n建立区域设置,Translate行为将根本不起作用。我应该将其加载到AppController中,以使其在应用程序范围内可用


非常感谢你的帮助

检查对象类
debug($this->Accounts->Countries)
-它是CountriesTable对象吗?模型类中的代码没有任何影响的通常原因是它们根本没有被加载(我指的是
国家表只有两个字段:id和code,但displayField是name
,sql不匹配)在Eclipse调试器表达式
$this->Accounts->Countries
中,它返回
Cake\ORM\Association\BelongsTo
。执行代码后,
$countries
变量的类型为
Cake\ORM\Query
。无论如何,如果它在AccountsTable中与
$this->belongsTo('Countries',['foreignKey'=>'country\u id','joinType'=>'internal'])链接良好,怎么能加载它呢如果在运行时语言环境是默认的语言环境-我想这是主要的混淆点。是的,这就是问题所在。我不确定这是不是正确的行为,。。我的意思是,即使我没有改变默认语言,它也应该一直接受翻译。而且,在,所以它总是被设置的。我已经在AppController中解决了在所有情况下在PreforeFind中设置语言的问题。
我不确定这是正确的行为
-这是设计的行为。翻译行为假设内容在原始表中,如果不更改区域设置或将其更改为默认值-将不会尝试检索翻译值。@AD7six我一直在尝试实现此行为,但现在我明白了为什么当前区域设置和默认区域设置永远不会不同,除非调用
I18n::locale()
。这是因为我使用的是
DispatcherFactory::add('LocaleSelector')在我的引导程序中。它从HTTP请求中获取区域设置,并进行修改。如果不使用I18n::locale()更改它,转换行为将永远不会起任何作用。@AD7six我已在CakePHP github中打开。谢谢和问候。