Добавление CASE в соединение запроса Cake - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь добавить оператор Case к разрабатываемому запросу.В одно из объединений мне нужно добавить условие, по каким полям присоединяться.1. Если field1 не является нулевым, используйте его 2. Иначе, если используйте field2, если не нулевое 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'
                ]
            ])

1 Ответ

0 голосов
/ 29 марта 2019

Я нашел решение этой проблемы.

$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
...