JoomlaはDBAND / ORグループから選択します

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)

公開され、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です。

バグではなく知識/構文のギャップにすぎないと確信していますが、ニーズに基づいて適切なクエリを作成する正しい方法はどのようになっていますか?

PS: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. これは、構文を構築する場所のさまざまな組み合わせを掘り下げた私の投稿のもう1つです。