在同一查询中多次有条件地重用“ hasOne”关联

时间:2018-08-23 15:32:40

标签: cakephp query-builder cakephp-3.x

我有什么

在我的OrdersTable.php中:

$this->hasOne('Total', [
    'className' => 'App\Model\Table\TotalsTable',
    'foreignKey' => 'order_id',
    'propertyName' => 'Total'
]);

实际totals表:

| id | order_id |     type | value |
|----|----------|----------|-------|
|  1 |        1 |    total |   100 |
|  2 |        1 |      tax |    20 |
|  3 |        1 | shipping |     5 |

结构和逻辑来自opencart/opencart,我对此无能为力。

我想要的

这是一个非功能性的概念:

$query = $ordersTable->find('all', array(
    'contain' => array(
        'TotalTax' => [
            'associationName' => 'Total',
            'conditions' => function($query) {
                return $query->where([
                    'TotalTax.type' => 'tax',
                ]);
            },
        ],
        'TotalShipping' => [
            'associationName' => 'Total',
            'conditions' => function($query) {
                return $query->where([
                    'TotalShipping.type' => 'shipping',
                ]);
            },
        ],
    ),
));

你们认为这样的事情可行吗?

UPD :由于每个type可能太多,因此无法创建关联

1 个答案:

答案 0 :(得分:0)

如果此功能可以在您的代码库中重复使用,我将在表级别实现此逻辑,并具有两个不同的条件关联:

OrdersTable.php

$this->hasOne('TotalTax', [
            'className' => 'Totals'
        ])
        ->setConditions(['TotalTax.type' => 'tax'])
        ->setDependent(true);

$this->hasOne('TotalShipping', [
            'className' => 'Totals'
        ])
        ->setConditions(['TotalShipping.type' => 'shipping'])
        ->setDependent(true);

然后您可以在查询中简单地包含它们:

$query = $ordersTable->find()->contain(['TotalTax', 'TotalShipping'];

可以在CakePHP documentation

中找到此示例