CakePHP3에서 DATE_FORMAT
DATE_FORMAT
로 Y-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
그대로.
무사히 희망대로의 데이터를 취득할 수 있었습니다.
Reference
이 문제에 관하여(CakePHP3에서 DATE_FORMAT), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/xx_small-yama/items/897f70fce4f02744edd5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$conditions = ["DATE_FORMAT(created, '%Y-%m-%d')" => 'CURRENT_DATE()'];
$query->where([
"DATE_FORMAT(created, '%Y-%m-%d') =" => $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
그대로.
무사히 희망대로의 데이터를 취득할 수 있었습니다.
Reference
이 문제에 관하여(CakePHP3에서 DATE_FORMAT), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/xx_small-yama/items/897f70fce4f02744edd5
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$created = $query->func()->date_format([
'created' => 'identifier',
"'%Y-%m-%d'" => 'literal'
]);
$query->where([
$created => $query->func()->now('date')
]);
$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);
});
Reference
이 문제에 관하여(CakePHP3에서 DATE_FORMAT), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/xx_small-yama/items/897f70fce4f02744edd5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)