使用OR条件的Cakephp 3.x连接始终为AND

时间:2016-10-22 07:11:42

标签: cakephp-3.0

代码

$query = $this->Client->find()
                ->hydrate(false)
                ->limit($limit)
                ->page($page)
                ->select(['Client.id','Client.achternaam','Client.Voornaam','clvsstatus.clientopnamestatus_id',
                    'clstatus.naam','afd.afdeling_naam','clsrtopn.naam'])
                ->join([
                    'clvsstatus' => [
                        'table' => 'client_vs_clientsoortstatus',
                        'type' => 'INNER',
                        'conditions' => [
                            'clvsstatus.client_id = client.id',
                            'clvsstatus.datum_van <='=>'2016-10-21',
                            'clvsstatus.datum_tot >='=>'2016-10-21',
                            **'OR' => ['clvsstatus.datum_tot'=>'0000-00-00']**                            
                        ],
                    ],
                    'clstatus' => [
                        'table' => 'clientsoortstatus',
                        'type' => 'INNER',
                        'conditions' => 'clstatus.id = clvsstatus.clientopnamestatus_id',
                    ],
                    'clvsafdeling' => [
                        'table' => 'client_vs_afdeling',
                        'type' => 'INNER',
                        'conditions' => [
                            'clvsafdeling.client_id = clvsstatus.client_id',
                            'clvsafdeling.client_id = clvsstatus.client_id '
                            ],
                    ],                    
                    'afd' => [
                        'table' => 'afdeling',
                        'type' => 'INNER',
                        'conditions' => 'afd.afdeling_afdelingid = clvsafdeling.afdeling_id',
                    ],                    
                    'clvssrtopn' => [
                        'table' => 'client_vs_clientsoortopname',
                        'type' => 'INNER',
                        'conditions' => 'clvssrtopn.client_id = client.id',
                    ],                    
                    'clsrtopn' => [
                        'table' => 'clientsoortopname',
                        'type' => 'INNER',
                        'conditions' => 'clsrtopn.id = clvssrtopn.clientopnamesoort_id',
                    ]                                                     

                ]) ;

结果SQL

SELECT 
  Client.id AS `Client__id`, 
  Client.achternaam AS `Client__achternaam`, 
  Client.Voornaam AS `Client__Voornaam`, 
  clvsstatus.clientopnamestatus_id AS `clvsstatus__clientopnamestatus_id`, 
  clstatus.naam AS `clstatus__naam`, 
  afd.afdeling_naam AS `afd__afdeling_naam`, 
  clsrtopn.naam AS `clsrtopn__naam` 
FROM 
  client Client 
  INNER JOIN client_vs_clientsoortstatus clvsstatus ON (
    clvsstatus.client_id = client.id 
    AND clvsstatus.datum_van <= '2016-10-21' 
    AND clvsstatus.datum_tot >= '2016-10-21' 
    **AND clvsstatus.datum_tot = '0000-00-00'**
  ) 
  INNER JOIN clientsoortstatus clstatus ON clstatus.id = clvsstatus.clientopnamestatus_id 
  INNER JOIN client_vs_afdeling clvsafdeling ON (
    clvsafdeling.client_id = clvsstatus.client_id 
    AND clvsafdeling.client_id = clvsstatus.client_id
  ) 
  INNER JOIN afdeling afd ON afd.afdeling_afdelingid = clvsafdeling.afdeling_id 
  INNER JOIN client_vs_clientsoortopname clvssrtopn ON clvssrtopn.client_id = client.id 
  INNER JOIN clientsoortopname clsrtopn ON clsrtopn.id = clvssrtopn.clientopnamesoort_id 
LIMIT 
  15 OFFSET 0

评论: 正如你在上面的代码和结果SQL中看到的,即使明确要求OR条件,蛋糕总是使它成为AND,任何人都可以帮助这个thnxs

1 个答案:

答案 0 :(得分:0)

您必须将第一次加入的条件重写为以下内容:

    'conditions' => [
        'clvsstatus.client_id = client.id',
        'OR' => [
            'clvsstatus.datum_tot'=>'0000-00-00',
            'AND' => [
                'clvsstatus.datum_van <='=>'2016-10-21',
                'clvsstatus.datum_tot >='=>'2016-10-21',
            ]
        ]
    ]