जूमला DB और / या समूहीकरण से चुनें

Jan 26 2021

मुझे जूमला में इस तरह के प्रश्नों को संभालने के बारे में कोई गाइड नहीं मिली:

मैं 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

जूमला के क्वेरीबिल्डर के लिए इसका अनुवाद करने के लिए:

$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)
        ]
    )

आपका आवश्यक तर्क पूरी तरह से तरीकों के डिफ़ॉल्ट glues के साथ संरेखित करता है, इसलिए कोई गोंद घोषणाएं आवश्यक नहीं हैं।

रेंडर की गई 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. विधि कॉल का पीछा करने या न करने से एसक्यूएल उत्पन्न होने वाले तरीके पर प्रभाव नहीं पड़ता है। दूसरे शब्दों में, आप किसी भी कोष्ठक को विधि कॉल के "श्रृंखला" को जारी रखने या तोड़ने से लाभ या हानि नहीं करते हैं।

  2. मैं उपयोग कर रहा हूं CURRENT_TIMESTAMPजब तक कि आपका $dateवह नहीं है जो मुझे लगता है कि यह है। पसंद:

    $db->quoteName('publish_up') . ' <= CURRENT_TIMESTAMP',
    
  3. यहाँ मेरी एक और पोस्ट है जो सिंटैक्स के निर्माण के विभिन्न संयोजनों में तल्लीन करती है ।