Joomla DB 및 / 또는 그룹에서 선택
Joomla에서 이러한 쿼리를 처리하는 방법에 대한 가이드를 찾지 못했습니다.
db에서 다음과 같은 모든 항목을 선택하고 싶습니다.
Published
AND
(the publish up date is 0000-00-00 00:00:00 or smaller then datenow)
OR
(the publish down date is 0000-00-00 00:00:00 or larger then datenow)
게시 된 모든 항목을 가져 오려면 현재 날짜가 게시 시작 / 종료 날짜 내에 있거나 설정된 시작 / 종료 값이 설정되지 않은 경우입니다.
지금까지 내가 가진 것은 간단한 쿼리입니다.
$query->where($db->quoteName('published') . ' = 1 ');
$query->where($db->quoteName('publish_up') . ' = ' . $db->quote('0000-00-00 00:00:00')) ->orWhere($db->quoteName('publish_up') . '<' . $db->quote($date));
$query->where($db->quoteName('publish_down') . ' = ' . $db->quote('0000-00-00 00:00:00')) ->orWhere($db->quoteName('publish_down') . '>' . $db->quote($date));
지금까지는 훌륭했지만 결국 다음과 같은 쿼리를 작성합니다.
SELECT *
FROM `tblname`
WHERE
(
(`published` = 1 AND `publish_up` = \'0000-00-00 00:00:00\') OR
(`publish_up`<\'2021-01-26 13:03:07\') OR `publish_down` = \'0000-00-00 00:00:00\') OR
(`publish_down`>\'2021-01-26 13:03:07\')
ORDER BY ordering ASC
Joomla는 내가 필요로하는 쿼리를 설정하거나 그룹화하지 않습니다. 첫 번째는 AND이고 나머지는 모두 OR입니다.
버그가 아닌 지식 / 구문 차이 일 뿐이라고 확신합니다.하지만 내 필요에 따라 적절한 쿼리를 작성하는 올바른 방법은 무엇입니까?
추신 : DB 테이블은 사용자 지정 구성 요소에서 가져옵니다.
답변
0000-00-00 00:00:00
항상 현재 날짜 / 시간 스탬프보다 작기 때문에 요구 사항을 다음과 같이 이해하고 있습니다.
published = 1
AND
publish_up <= now
AND
(
publish_down = 0000-00-00 00:00:00
OR
publish_down > now
)
where()
기본 글루 값은AND
입니다.andWhere()
기본 글루 값은OR
입니다.
Joomla의 querybuilder로 번역하려면 다음과 같이 작성합니다.
$query ->where( [ $db->quoteName('published') . ' = 1'),
$db->quoteName('publish_up') . ' <= ' . $db->quote($date), ] ) ->andWhere( [ $db->quoteName('publish_down') . ' = ' . $db->quote('0000-00-00 00:00:00'), $db->quoteName('publish_down') . ' > ' . $db->quote($date)
]
)
필요한 로직은 메서드의 기본 글루와 완벽하게 일치하므로 글루 선언이 필요하지 않습니다.
렌더링 된 SQL :
WHERE
(`published` = 1 AND `publish_up` <= '2021-01-26 13:03:07') AND
(`publish_down` = '0000-00-00 00:00:00' OR `publish_down` > '2021-01-26 13:03:07')
메모:
메서드 호출을 연결하거나 연결하지 않아도 SQL이 생성되는 방식에 영향을주지 않습니다. 즉, 메서드 호출의 "체인"을 계속하거나 끊어도 괄호를 얻거나 잃지 않습니다.
내가 사용하는 것이
CURRENT_TIMESTAMP
당신이하지 않으면$date
내가 생각하는 것이 아니다. 처럼:$db->quoteName('publish_up') . ' <= CURRENT_TIMESTAMP',
다음은 구문 작성 위치의 다양한 조합에 대해 설명하는 또 다른 게시물입니다 .