CakePHP 3:TranslateBehavior在作为别名的模型上

时间:2016-06-10 08:31:22

标签: php cakephp internationalization associations cakephp-3.0

在一个项目中,我有两个模型,产品和包。包可以看作是Products的容器,也可以定义包中的项我创建了一个模型PackageItem(它基本上是一个Product,所以它使用相同的表)。现在,Products(以及PackageItems)具有可翻译的字段,例如标题和描述。

ProductsTable.php包含:

$this->addBehavior('Translate', [
 'fields' => ['title', 'description'],
 'translationTable' => 'products_translations'
]);
$this->belongsToMany('PackageItems', [
 'foreignKey' => 'package_id',
 'joinType' => 'LEFT',
 'joinTable'=>'products_package_items'
]);

PackageItemsTable包含:

$this->table('products');

$this->addBehavior('Translate', [
 'fields' => ['title', 'description'],
 'translationTable' => 'products_translations'
]);

$this->belongsTo('Products', [
 'foreignKey' => 'package_item_id',
 'joinType' => 'LEFT'
]);

使用TranslateBehavior我可以返回产品上的翻译,但我无法弄清楚如何编写查询,我还需要在PackageItems上返回翻译。这是我目前的查询:

$package = $this->Products->find('translations')
  ->where(['business_id'=>$q['business_id'], 'id'=>$id, 'type'=>'Package'])
  ->contain([
    'PackageItems'=>[
      'Prices'=>function($q) {
        return $q->where(['product_id'=>$this->product_id]);
      }
    ]
  ])
  ->first();

1 个答案:

答案 0 :(得分:0)

你需要两件事

1)设置正确的参考名称

PackageItemsTable类的翻译行为需要配置为使用相同的引用名称(存储在model列中的值)作为ProductsTable类的行为,否则你永远不会收到任何翻译,因为它默认会查找PackageItems

这是referenceName选项可用于的内容。引用名称是从类名(不是别名)派生的,或者是从数据库表名或别名派生的自动表。因此,对于ProductsTable课程,它将是Products

手动设置名称

$this->addBehavior('Translate', [
    'fields' => ['title', 'description'],
    'translationTable' => 'products_translations',
    'referenceName' => 'Products' // there it goes
]);

或从ProductsTable上的行为中动态检索它,例如

$referenceName = $this->Products
    ->target()
    ->behaviors()
    ->get('Translate')
    ->config('referenceName');

然而,在为belongsTo表添加相应的Products关联后,需要完成此操作!

2)使用translations取景器进行收容

您需要配置PackageItems包含以使用translations取景器,这就像

一样简单
contain([
    'PackageItems' => [
        'finder' => 'translations', // there you go
        'Prices' => function ($q) {
            return $q->where(['product_id' => $this->product_id]);
        }
    ]
])

另见