首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CakePHP 3:作为别名工作的模型上的TranslateBehavior

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

Stack Overflow用户
提问于 2016-06-10 08:31:22
回答 1查看 392关注 0票数 1

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

ProductsTable.php包含:

代码语言:javascript
运行
复制
$this->addBehavior('Translate', [
 'fields' => ['title', 'description'],
 'translationTable' => 'products_translations'
]);
$this->belongsToMany('PackageItems', [
 'foreignKey' => 'package_id',
 'joinType' => 'LEFT',
 'joinTable'=>'products_package_items'
]);

PackageItemsTable包含:

代码语言:javascript
运行
复制
$this->table('products');

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

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

使用TranslateBehavior,我可以返回产品上的翻译,但我不知道如何编写查询,我也需要在PackageItems上返回翻译。这是我当前的查询:

代码语言:javascript
运行
复制
$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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-11 13:38:07

你需要两件事

1)设置正确的引用名称

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

这就是可以使用referenceName选项的地方。引用名是从类名(而不是别名)派生的,或者是从数据库表名或别名派生的自动表。因此,对于您的ProductsTable类,它将是Products

或者手动设置名称

代码语言:javascript
运行
复制
$this->addBehavior('Translate', [
    'fields' => ['title', 'description'],
    'translationTable' => 'products_translations',
    'referenceName' => 'Products' // there it goes
]);

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

代码语言:javascript
运行
复制
$referenceName = $this->Products
    ->target()
    ->behaviors()
    ->get('Translate')
    ->config('referenceName');

但是,这需要在为belongsTo表添加相应的Products关联之后完成!

2)使用translations查找器作为容器

您需要配置PackageItems容器以使用translations查找器,它非常简单

代码语言:javascript
运行
复制
contain([
    'PackageItems' => [
        'finder' => 'translations', // there you go
        'Prices' => function ($q) {
            return $q->where(['product_id' => $this->product_id]);
        }
    ]
])

另请参阅

  • API > \Cake\ORM\Behavior\TranslateBehavior::
  • API > \Cake\ORM\Behavior\TranslateBehavior::$
  • API > \Cake\ORM\Query::contain()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37743537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档