簡體   English   中英

CakePHP多條件SQL語句

[英]CakePHP Multi-Conditional SQL statement

使用CakePHP版本3.4.12和MySQL ...我在使用SQL時遇到了麻煩,然后在將SQL導入CakePHP時遇到了麻煩。 我想查看今天可能已進入和退出,今天或之前已進入,今天或之后已退出,或者它們今天或之前進入但仍沒有退出時間的記錄。 並跳過所有標記為非活動(inactive = true)的記錄。

數據摘錄:

id  name    time_in             time_out            inactive
174 smith   8/15/2017 21:00     8/15/2017 21:22     NULL
175 roberts 8/15/2017 21:21     8/15/2017 21:21     NULL
176 Wagner  9/2/2017 4:40       9/3/2017 18:29      0
177 JAmes   9/1/2017 3:35       NULL                0
178 john    9/4/2017 3:59       9/4/2017 22:22      NULL
180 erwer   9/4/2017 4:01       NULL                1
181 waynbe  9/4/2017 4:02       NULL                NULL
182 Roger   9/4/2017 22:21      9/4/2017 22:22      NULL
183 Felix   9/4/2017 22:24      NULL                NULL

如果我在SQL中犯了一個錯誤,我想查找所有

不是“ 非活動狀態 ”(不是TRUE)

還有哪里

'time_in'<= '2017年9月4日23時59分59秒'與'TIME_OUT'> = '2017年9月4日00:00:00'

- - 要么 - -

' time_out '為NULL AND'time_in '<='2017-09-04 23:59:59'

所需的返回結果是:

id  name    time_in             time_out            inactive
177 JAmes   9/1/2017 3:35       NULL                0
178 john    9/4/2017 3:59       9/4/2017 22:22      NULL
181 waynbe  9/4/2017 4:02       NULL                NULL
182 Roger   9/4/2017 22:21      9/4/2017 22:22      NULL
183 Felix   9/4/2017 22:24      NULL                NULL

我試圖實現的條件SQL是:

WHERE (time_in <= '2017-09-04 23:59:59' AND time_out >= '2017-09-04 00:00:00') 
OR (isnull(time_out) AND time_in <= '2017-09-04 23:59:59') 
AND inactive != 1 

這給出了結果,並且缺少數據:

id  name    time_in             time_out            inactive
177 JAmes   9/1/2017 3:35       NULL                0
178 john    9/4/2017 3:59       9/4/2017 22:22      NULL
182 Roger   9/4/2017 22:21      9/4/2017 22:22      NULL

但是,在使用以下方法嘗試CakePHP時:

$query= $this->StationEntries->find('all')
            ->andWhere(['time_in <='=> $dateIn, 'time_out >='=>$dateOut])
            ->orWhere(['isnull(time_out)', 'time_in <='=> $dateIn])
            ->andWhere(['inactive !='=>true]);

創建SQL:

WHERE 
(
 (
  (
    time_in <= '2017-09-04 23:59:59' 
    AND time_out >= '2017-09-04 00:00:00'
  ) 
  OR (
    isnull(time_out) 
    AND time_in <= '2017-09-04 23:59:59'
  )
 ) 
 AND inactive != 1
) 

這將返回以下結果,並且丟失更多記錄。

id  name    time_in             time_out            inactive
177 JAmes   9/1/2017 3:35       NULL                0

以下內容可以正常工作,只是它不會過濾掉不活動的記錄。

$query= $this->StationEntries->find('all')
        ->where(['time_in <='=> $dateIn, 'time_out >='=>$dateOut])
        ->orWhere(['isnull(time_out)', 'time_in <='=> $dateIn]);

我在書中讀過:

從3.5.0版開始,不推薦使用orWhere()方法。 這種方法很難根據當前查詢狀態預測SQL。 請改用where(),因為它更容易被發現並且更容易理解行為。 1

因此,我在兩個方面尋求幫助:

  1. 我在SQL WHERE子句中的錯誤在哪里,應該是什么?
  2. 如何在避免orWhere()方法的情況下將其轉換為CakePHP查詢生成器,以及如何做到這一點?

謝謝您的幫助。

根據文檔,要添加“ OR”子句,您需要將“ OR”作為array中的鍵 認為您正在尋找:

->where(
   [
      'time_in <=' => $dateIn, 'time_out >=' => $dateOut,
      'OR' => [
         ['time_out IS NULL', 'time_in <=' => $dateIn
      ]
   ]
)->andWhere( [ 'inactive !=' => 1 ] )

基本上,這應該導致:

(
   (time_in < dateIn AND time_out < dateOut)
   OR ( time_out IS NULL AND time_in < dateIn)
) 
AND ( inactive != 1 )

您可以簡化為:

->where( [ 'time_in <=' => $dateIn ], [ 'inactive !=' => 1 ] )
->andWhere(
[
   'time_out >=' => $dateOut,
   'OR' => [ 'time_out IS NULL' ]
])

首先,IS NULL不等於!TRUE(!= 1)。 那是第一個問題。 固定。

正確的SQL來自原始的簡化查詢(感謝@cwallenpoole朝着正確的方向推進):

->where( [ 'time_in <=' => $dateIn,  'inactive IS NULL',
'OR' =>(['time_out >=' => $dateOut,'time_out IS NULL' ])])

如果從架構中刪除空值,則它將類似於:

->where( [ 'time_in <=' => $dateIn,  'inactive !=' =>1,
'OR' =>(['time_out >=' => $dateOut,'time_out IS NULL' ])])

結果導致CakePHP查詢:

WHERE 
  (
    time_in <= '2017-09-04 23:59:59' 
    AND inactive IS NULL 
    AND (
      time_out >= '2017-09-04 00:00:00' 
      OR time_out IS NULL
    )
  ) 

這將返回正確的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM