【问题标题】:Adding a CASE into A Cake query join将 CASE 添加到 Cake 查询连接中
【发布时间】:2019-03-29 15:23:43
【问题描述】:

我正在尝试将 Case 语句添加到我正在开发的查询中。在其中一个连接上,我需要添加一个条件来确定要连接的字段。 1. 如果 field1 不为空,则使用它 2. else if 使用 field2 if not null 3. 否则使用fallbackField。

我有一个只使用 sql 的有效查询。但希望转换它。 我也有一个多重连接设置(只需要一个条件)

有效的原始 sql


SELECT * 
FROM   customers c 
       INNER JOIN member_customers mc 
               ON c.id = mc.customer_id 
       INNER JOIN enums e 
               ON CASE 
                    WHEN e.source_id IS NOT NULL 
                         AND mc.id = e.source_id THEN 1 
                    WHEN e.org_id IS NOT NULL 
                         AND c.org_id = e.org_id THEN 1 
                    ELSE e.enum_name = 'Sold' 
                  END = 1 
       INNER JOIN enum_values ev 
               ON e.id = ev.enum_id 
                  AND mc.state = ev.enum_value 
WHERE  mc.user_id = 999
GROUP  BY c.NAME 

到目前为止我的 Cake 转换

        $query = $this->Customers->MemberCustomers->find('all')
            ->contain(['Customers'])
            ->join([
                'c' => [
                    'table' => 'customers',
                    'type' => 'LEFT',
                    'conditions' => 'c.id = MemberCustomers.customer_id'
                ],
                'e' => [
                    'table' => 'enums',
                    'type' => 'LEFT',
                    'conditions' => '//where the conditions need to be'
                ],
                'ev' => [
                    'table' => 'enum_values',
                    'type' => 'LEFT',
                    'conditions' => 'e.id = ev.enum_id AND MemberCustomers.state = ev.enum_value'
                ]
            ])

【问题讨论】:

    标签: cakephp cakephp-3.0


    【解决方案1】:

    我找到了解决这个问题的方法。

    $caseConditions = $query->newExpr()->addCase([
    $query->newExpr()->add(['e.source_id IS  NULL AND MemberCustomers.id = e.source_id']),
    $query->newExpr()->add(['e.source_id IS  NULL AND MemberCredentials.id = e.source_id'])
    ...
    ])
    

    比在条件部分中

    'conditions' => $caseConditions
    

    【讨论】:

      【解决方案2】:
      'e' => [
          'table' => 'enums',
          'type' => 'LEFT',
          'conditions' => 
              '(CASE WHEN e.source_id IS NOT NULL
              AND mc.id = e.source_id THEN 1
              WHEN e.org_id IS NOT NULL 
              AND c.org_id = e.org_id THEN 1 
              ELSE e.enum_name = 'Sold' 
              END) = 1'
      ]
      

      【讨论】:

      • 请对您提供的代码进行解释。例如,为什么问题中的代码不起作用或解释您的代码是如何工作的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多