DB VE / VEYA gruplamasından Joomla seçin

Jan 26 2021

Joomla'da bu tür sorguların nasıl ele alınacağına dair herhangi bir rehber bulamadım:

Aşağıdaki tüm öğeleri db'den seçmek istiyorum:

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)

yayınlanmış ve datenow tüm öğeleri almak için yayınlama başlangıç ​​/ bitiş tarihi içinde veya ayarlanmış başlangıç ​​/ bitiş değerleri ayarlanmadığında.

Şimdiye kadar sahip olduğum şey basit bir sorgu:

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

Şimdiye kadar her şey yolunda ama sonunda şöyle bir sorgu oluşturuyor:

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, sorguyu ihtiyacım olduğu gibi ayarlamıyor veya gruplamıyor, ilki AND ve diğer her şey OR.

Eminim bu bir hatadan ziyade bir bilgi / sözdizimi boşluğu - ama ihtiyaçlarıma göre uygun bir sorgu yazmanın doğru yolu nasıldır?

Not: DB tablosu özel bir bileşendendir

Yanıtlar

2 mickmackusa Jan 27 2021 at 07:29

Çünkü 0000-00-00 00:00:00her zaman geçerli tarih saat damgası daha az olacaktır, ben senin ihtiyaçlarını olarak anlayışlıyımdır:

published = 1
AND
publish_up <= now
AND
(
    publish_down = 0000-00-00 00:00:00
    OR
    publish_down > now
)
  • where()varsayılan tutkal değerine sahiptir AND.
  • andWhere()varsayılan tutkal değerine sahiptir OR.

Bunu Joomla'nın sorgu oluşturucusuna çevirmek için şunları yazarsınız:

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

Gerekli mantığınız, yöntemlerin varsayılan yapıştırıcılarıyla mükemmel bir şekilde uyumludur, bu nedenle hiçbir yapıştırıcı beyanı gerekli değildir.

Oluşturulan 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')

Notlar:

  1. Yöntem çağrılarını zincirlemek veya zincirlememek, sql'nin üretilme şeklini etkilemez. Başka bir deyişle, bir yöntem çağrıları "zincirini" sürdürmekten veya kırmaktan herhangi bir parantez kazanmaz veya kaybetmezsiniz.

  2. Kullandığım olurdu CURRENT_TIMESTAMPsenin sürece $dateben bunun düşündüğüm şey değildir. Sevmek:

    $db->quoteName('publish_up') . ' <= CURRENT_TIMESTAMP',
    
  3. İşte sözdizimi oluşturmanın farklı kombinasyonlarını araştıran yazılarımdan bir diğeri .