JDatabase ile aynı anda birden fazla kayıt eklenebilir mi?


11

Bir döngü kullanmak yerine, Joomla veritabanı işlevleri böyle bir SQL ifadesi oluşturabilir mi?

INSERT INTO #__tablename (col1,col2)
VALUES 
 ('1', 'one'),
 ('2', 'two'),
 ('3', 'three'),
...
 ('999', 'three'),

JDatabase'i kullanarak veritabanına erişme konusundaki dokümanlar, İşlemler ve SQL veya Nesneleri kullanma konusuna bakın, ancak her iki durumda da birden fazla değerden bahsedilmez.

Yanıtlar:


12

Bu, ->insert()ve kullanılarak ->values(), $valueseklenecek sütunları içeren dizelerin bir dizisi kullanılarak gerçekleştirilebilir .

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$columns = array('col_one','col_two');
$values = array();
// Proper escaping/quotes should be done here, and probably in a loop, but cluttered the answer, so omitted it
$values[] = '1, "one"';
$values[] = '2, "two"';
$values[] = '3, "three"';
$values[] = '999, "nineninetynine"';

$query->insert($db->quoteName('#__tablename'));
$query->columns($columns);
$query->values($values);
$db->setQuery($query);
$db->query();

Kullanılarak üretilen SQL echo $query->dump()

INSERT INTO `xyz_tablename`
(col_one,col_two) VALUES 
(1, "one"),(2, "two"),(3, "three),(999, "nineninetynine")

3

Joomla core temel SQL sorgularını destekler. Birkaç eki saklamak için bir sınıf oluşturabilir ve sonunda tek bir eki yürütmek için tek bir son sorgu oluşturabilirsiniz.

    public function flushInserts()
{
    $db = JFactory::getDbo();

    foreach ($this->bulk_tables as $table)
    {
        // No inserts
        if (!array_key_exists($table, $this->bulk_inserts))
        {
            continue;
        }

        $tableq = $db->qn($table);

        $insertSet = $this->bulk_inserts[$table];
        $values = implode(',', $insertSet);
        $query = 'INSERT INTO ' . $tableq . ' VALUES ' . $values . ';';

        $db->setQuery($query);
        $db->execute();

        if ($error = $db->getErrorMsg())
        {
            throw new Exception($error);
        }
    }

    $this->bulk_inserts = array();
}

0

@ GDP'nin cevabına ekleme

...
$columns = array('user_id', 'type', 'object', 'lvl', 'date');
$values  = array();
foreach ($batch as $row) {
    $array    = array(
        $row->user_id,
        $db->quote($row->type),
        $db->quote($row->object),
        $db->quote($row->lvl),
        $db->quote($row->date),
    );
    $values[] = implode(',', $array);
}
$query->insert($db->quoteName('#__activity_log'));
$query->columns($db->quoteName($columns));
$query->values($values);
...

Cevabınızda @ GSYİH'nın kabul edilen cevabı tarafından kapsanmayan değeri açıklayabilir misiniz? Bu neredeyse sadece kodla ilgili bir cevaptır.
mickmackusa

$valuesDeğişkenin comma separated row stringsprogramlı bir dizi ile nasıl doldurulacağını gösterir , bu da çok fazla zaman kazandırır ve cevaplarında olduğu gibi virgülle ayrılmış dizeleri manuel olarak oluşturmak veya hatta bu konu için birleştirmek yerine hatalar için daha düşük marja sahiptir .
Mohd Abdul Mujib

Bu bilgiler, gelecekteki araştırmacıları eğitebilmesi için cevabınızda paketlenmelidir.
mickmackusa

Gördüğüm gibi, kod oldukça açıklayıcı olsa da, kesinlikle iyileştirme alanları olabilir, eğer öyle düşünüyorsanız, lütfen cevabı düzenlemek ve geliştirmek için çekinmeyin
Mohd Abdul Mujib

Kodunuz php / Joomla sözdiziminin ne anlama geldiğini anlayanlar için açıklayıcıdır. Kendi çalışmanızı geliştirmek istemez misiniz? JSX'te (Stackoverflow'dan daha fazlası) cevapları tam olarak açıklamak çok önemlidir çünkü web geliştirme alanında yeni bir kariyere yeni başlayanlar CMS tarafından teşvik edilmektedir. Burada içerik yayınlamanın amacının eğitmek olduğunu anlıyorsunuz, değil mi? Yani, en iyi cevabınızı ve risk kazanma oylarınızı göndermenizi tavsiye ediyorum.
mickmackusa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.