Joomla DB 및 / 또는 그룹에서 선택

Jan 26 2021

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 테이블은 사용자 지정 구성 요소에서 가져옵니다.

답변

2 mickmackusa Jan 27 2021 at 07:29

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')

메모:

  1. 메서드 호출을 연결하거나 연결하지 않아도 SQL이 생성되는 방식에 영향을주지 않습니다. 즉, 메서드 호출의 "체인"을 계속하거나 끊어도 괄호를 얻거나 잃지 않습니다.

  2. 내가 사용하는 것이 CURRENT_TIMESTAMP당신이하지 않으면 $date내가 생각하는 것이 아니다. 처럼:

    $db->quoteName('publish_up') . ' <= CURRENT_TIMESTAMP',
    
  3. 다음은 구문 작성 위치의 다양한 조합에 대해 설명하는 또 다른 게시물입니다 .