CakePHP3에서 DATE_FORMAT

4970 단어 MySQLcakephp3
  • Datetime에 저장된 데이터를 DATE_FORMATY-m-d 형식으로 조건으로 좁히고 싶습니다.
  • 어려운 일은 아닙니다만, 조금은 빠져서 비망록.


  • CakePHP2와 CakePHP3에서 쓰는 방법의 차이



    CakePHP2의 경우



    CakePHP2까지는 conditions에 생각한대로의 것을 쓰면 할 수 있습니다.
    $conditions = ["DATE_FORMAT(created, '%Y-%m-%d')" => 'CURRENT_DATE()'];
    

    이제 CURRENT_DATE() 로 좁힌 데이터를 검색할 수 있습니다.

    CakePHP3의 경우



    CakePHP3에서도 비슷한 것이라고 생각하고 있었으므로 아래와 같이 기술.
    (단 = 를 붙이지 않으면 에러가 발생하므로 주의)
    $query->where([
        "DATE_FORMAT(created, '%Y-%m-%d') =" => $query->func()->now('date')
    ])
    
    CURRENT_DATE() 를 CakePHP3처럼 $query->func()->now('date') 라고 기술.

    문제



    일견 위에서 문제가 없도록 동작하고 있었습니다만, 데이터가 잘 잡히지 않은 것이 발각.
    출력된 SQL의 WHERE를 확인해 보면,
    WHERE 
      DATE_FORMAT(created, '%y-%m-%d') = (
        CURRENT_DATE()
      ) 
    
    %Y 로 지정한 것이 %y 로 되어 있습니다.
    ……왜.

    대책



    1. func()->date_format() 사용



    그대로 기술하는 것이 원인과 같기 때문에 func() 를 사용하여 DATE_FORMAT 를 기술해 보겠습니다.
    $created = $query->func()->date_format([
        'created' => 'identifier',
        "'%Y-%m-%d'" => 'literal'
    ]);
    
    $query->where([
        $created => $query->func()->now('date')
    ]);
    

    Illegal offset type……
    조건에 사용하는 가정이 아닌가, 분노합니다.
    그렇지만 $query->func()->now('date') 도 사용하고 싶다. (반대로 해 보았지만 역시 화난다)

    2. 보다 CakePHP3 같은 글쓰기


    func()->date_format() 를 사용하면서 CakePHP3의 설명에 더 가까워 보겠습니다.
    $created = $query->func()->date_format([
        'created' => 'identifier',
        "'%Y-%m-%d'" => 'literal'
    ]);
    
    $today = $query->func()->now('date');
    
    $query->where(function ($exp) use ($created, $today) {
       return $exp->eq($created, $today);
    });
    

    발행된 SQL을 확인해도 %Y 그대로.
    무사히 희망대로의 데이터를 취득할 수 있었습니다.

    좋은 웹페이지 즐겨찾기