2017-12-20 40 views
2

24 시간 이전으로 생성 된 모든 레코드를 가져 오려고합니다. 여기서 'created'는 datatime 필드입니다. 나는이 조건을 만족시켜야하지만 0 레코드를 반환하는 DB에 3 개의 레코드를 가지고 있습니다.cakephp 3.x 날짜/시간 필드 비교가 올바른 결과를 반환하지 않음

$my_table_tbl = TableRegistry::get('my_table'); 
$records = $my_table_tbl 
    ->find() 
    ->where([ 
     'created <' => '(NOW() - INTERVAL 1 DAY)', 
     'status' => 'pending' 
    ]) 
    ->toArray(); 

답변

1

CakePHP는 항상 절의 오른쪽을 변수 바인딩으로 처리합니다. 즉, (NOW() - INTERVAL 1 DAY)은 문자열 값으로 해석됩니다.

쿼리를 문자열로 변환하여 생성되는 SQL을 확인할 수 있습니다.

$query = $my_table_tbl->find() 
       ->where([ 
       'created <' => '(NOW() - INTERVAL 1 DAY)', 
       'status' => 'pending' 
       ]); 
dd((string)$query); 

위의 SQL을 출력하면 표현식 대신 created < :c0이 표시됩니다.

사용자 지정 식을 만들려면 쿼리 개체를 사용하십시오.

$q = $my_table_tbl->query(); 
$query = $my_table_tbl 
    ->find() 
    ->where([ 
     'created <' => $q->newExp('(NOW() - INTERVAL 1 DAY)'), 
     'status' => 'pending' 
    ]); 
dd((string)$query); 

예상대로 출력 위의 SQL이 created < (NOW() - INTERVAL 1 DAY) 표시됩니다

. 이것은 CakePHP가 오른손의 값이 표현 개체인지 확인하기 때문입니다.

+1

완벽을 기하기 위해 [**'FunctionsBuilder :: dateAdd()'**] (https://api.cakephp.org/3.5/class-Cake.Database.FunctionsBuilder.html#_dateAdd) 크로스 스키마 호환 SQL 생성을 지원합니다. – ndm

+0

@cgtag 그것은 나를 위해 일했습니다. 많은 감사합니다. ** newExpr() ** - Row Expression을 만드는 메소드가 마술을했습니다. –