【问题标题】:CakePHP 3: TranslateBehavior on a model that works as an aliasCakePHP 3:作为别名工作的模型上的 TranslateBehavior
【发布时间】:2016-06-10 08:31:22
【问题描述】:

在一个项目中,我有两个模型,产品和包。包可以看作是产品的容器,为了定义包中的项目,我创建了一个模型 PackageItem(它基本上是一个产品,所以它使用同一个表)。现在产品(以及 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,我可以返回 Product 的翻译,但我不知道如何编写查询,我还需要返回 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();

【问题讨论】:

  • 从您的代码示例中,您的 PackageItemsTable 类似乎没有使用 Translate 行为,因此不清楚您的问题是什么,可能缺少的行为,或者您不知道如何为容器设置查找器?
  • 对不起,我忘记粘贴了。我确实也将翻译行为附加到 PackageItems,这是我正在努力解决的查询
  • 请把它放在你的问题中,这样人们就可以看到你是如何配置它的,并重现确切的问题。

标签: php cakephp internationalization associations cakephp-3.0


【解决方案1】:

你需要两件事

1) 设置正确的参考名称

PackageItemsTable 类上的翻译行为需要配置为使用与 ProductsTable 类上的行为相同的引用名称(存储在 model 列中的值),否则您永远不会接收任何翻译,因为它默认会查找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');

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

2) 使用translations 查找器进行收容

您需要配置PackageItems 遏制以使用translations finder,就像

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

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    相关资源
    最近更新 更多