Nasıl Zend_Db'nin ile birden fazla satır eklerim?

6 Cevap php

Ben bu gibi daha fazla veya daha az görünüyor bilgi içeren bir dizi var:

$data[] = array('content'=>'asd');
$data[] = array('content'=>'asdf');

Ve ben veritabanına hem girişleri eklemek istiyorum.

$db->insert('table', $data);

hem girişleri katmıyor. Ben yanlış ne yapıyorum? Ben Zend_ Db_Table kullanmak zorunda mı?

$data = array('content'=>'asdf');
$db->insert('table', $data);

Tabii eserleri

6 Cevap

Ben Zend_Db, birden çok satır ekleme destekler sanmıyorum.

Sadece iki satır ya da biraz daha fazla varsa, ama sadece bir döngü kullanabilirsiniz.

foreach ($data as $row)
{
    $db->insert('table', $row)
}


Bill Karwin, a former Zend Framework developer, wrote this on Nabble some time ago:

Satır kümeleri temelde bir koleksiyon nesnesi, bu yüzden satır kümesine eklenecek izin bu sınıfın yöntemleri eklersiniz. Peki bunu yapmak mümkün olmalıdır:

// creates a rowset collection with zero rows
$rowset = $table->createRowset();

// creates one row with unset values 
$row = $table->createRow();

// adds one row to the rowset 
$rowset->addRow($row); 

// iterates over the set of rows, calling save() on each row
$rowset->save(); 

Bu N boş satırları oluşturmak için () createRowset bir tamsayı geçmek için hiçbir mantıklı. Sadece zaten değerler ile bunları doldurmak için bunların arasında dolaşmak gerekir. Yani siz de uygulama verileri tek tek satırları oluşturmak ve doldurmak için bir döngü yazmak ve sonra koleksiyonuna eklemek olabilir.

$rowset = $table->createRowset();
foreach ($appData as $tuple) 
{
    $row = $table->createRow($tuple);
    $rowset->addRow($row);
}
$rowset->save();

Bu createRow bir başlığın geçen kullanım () ile uyumlu olacağından,) diziler dizisi createRowset (geçirilen izin için mantıklıdır.

$rowset = $table->createRowset($appData); // pass array of tuples

Bu kaydetmek için hazır yeni satır yeni bir satır kümesi, () d yaratarak, (sonunda () kaydetmek için hariç) yukarıdaki önceki örnekte olduğu gibi aynı döngü gerçekleştirmek olacaktır.

Ekleme verilerin verimliliğini artırmak için SQL iki yol vardır:

  1. Birden fazla satır tek bir INSERT deyimini kullanın:

    , T (sütun1, sütun2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9) INSERT INTO

  2. INSERT deyimi hazırlamak ve bunu birden çok kez çalıştırmak:

    PREPARE INSERT INTO t (col1, col2, col3) VALUES (?, ?, ?); EXECUTE 1, 2, 3 EXECUTE 4, 5, 6 EXECUTE 7, 8, 9

Ancak, bu gelişmeler birini destekleyen Satır ve satır kümesi sınıfları karmaşıklık eklersiniz. Bu akım Zend_Db_Table_Row sınıf takılı veya () tasarruf çağırdığınızda güncelleştirilmesi gerekiyor bir satır arasında ayrım iç yolu kaynaklanmaktadır. Bu ayrım Sıra nesnesi tarafından saklanmış, bu nedenle bireysel satırlar yeni satırlar veya mevcut satır değiştirilmiş kopya olup olmadığını satır kümesi bilmiyor. Bu nedenle daha verimli SQL kullanır () yöntemi bir kurtarış çoklu satır sunmak için satır kümesi sınıf için, kirli veri yönetimi tamamen refactored gerekir. Satır kümesi her biri () tasarruf çağırarak, onun satırları üzerinde yineleme için kolay bir çözümdür. O bir satır eklemek için optimize SQL yardımcı olmasa Bu, OO kapsülleme için iyidir.

Verimli SQL için büyük ihtiyaç var olduğunda herhangi bir durumda, bu, tipik bir web isteği veri toplu yük birçok satır gerçekten nadirdir. Satır küçük bir sayı için verimliliği fark küçüktür, bu nedenle toplu yükleme satır çok sayıda konum yalnızca gözle görülür bir gelişme olacaktır. Bu durumda, size başka bir RDBMS marka kullanmak eğer MySQL LOAD DATA deyimi veya eşdeğer özelliğini kullanıyor olmalıdır, zaten INSERT kullanarak olmamalıdır. INSERT genellikle çok sayıda veri yükleme için en verimli seçim değildir.

Dönen otomatik oluşturulan tuşları ile ilgili olarak, ben rahatsız olmaz. (Örneğin mysql CLI) düz SQL kullanmak, ve tek bir INSERT deyimi içinde birden çok satır eklerseniz, yalnızca eklenen tüm satırlar için id değerleri, son oluşturulan id değerini alabiliriz dikkat edin. Bu SQL davranıştır; herhangi bir dil veya herhangi bir çerçeve için doğrudur.

, T (sütun1, sütun2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9) INSERT INTO
SELECT LAST_INSERT_ID(); -- returns only the id for the third tuple

Her satır için id ihtiyaç yaparsanız, bir döngü yazmak gerekir ve her satır eklendiğinde sonra oluşturulan id almak, Satırlar bir kerede bir tane yerleştirin.

Zend_Db_Adapter_Abstract::query() yöntemiyle - multi-satır INSERT tablolar dahil olmak üzere - İstediğiniz herhangi bir SQL sözdizimi yürütebilirsiniz.

Ama Zend_Db_Table ve yöntemleri Zend_Db_Table_Rowset sınıfları tek seferde birden fazla satır eklemek için herhangi bir destek yok.

Birden fazla satır eklemek için size Zend_Db kullanabilirsiniz

$stmt = $table->getAdapter()->prepare('INSERT INTO tablename (col1, col2, col3) VALUES (?, ?, ?), (?, ?, ?)');

$stmt->execute( array($value1, $value2, $value3, $value4, $value5, $value6) );

(Bill Karwin itibaren)

Senin durumunda bu kod bu değiştirebilirsiniz:

$data[] = array('content'=>'asd');
$data[] = array('content'=>'asdf');

$stmt = $table->getAdapter()->prepare('INSERT INTO table (col1) VALUES (?), (?)');
$stmt->execute( $data );

Bu '(?) (?)' oluşturmak için dinamik, veri dinamik örtmek, bu pasajı kullanarak deneyebilirsiniz:

$values = implode(',',array_fill(0,count($data),'(?)'));

Bu yardımcı olur umarım

regards, Riki Risnandar

Burada benim çözümdür:

public function saveRows($array) {
        $vAmount    = count($array);
        $values     = array();
        $columns    = array();

        foreach ($array as $colval) {
            foreach ($colval as $column=>$value) {
                array_push($values,$value);
                !in_array($column,$columns) ? array_push($columns,$column) : null;
            }
        }

        $cAmount    = count($columns);
        $values     = array_chunk($values, $cAmount);
        $iValues    = '';
        $iColumns   = implode("`, `", $columns);

        for($i=0; $i<$vAmount;$i++)
            $iValues.="('".implode("', '", $values[$i])."')".(($i+1)!=$vAmount ? ',' : null);

        $data="INSERT INTO `".$this->_name."` (`".$iColumns."`) VALUES ".$iValues;
        die($data);
        $this->query($data);
    }

Eğer ZF2 kullanırsanız o zaman çözüm bu gibi olabilir:

$insert = $this->getSql()->insert();
foreach ($values as $value) {
    $relation = array(
        'column_one' => $value,
        'column_two' => $value
    );
    $insert->values($relation, Insert::VALUES_MERGE);
}

$insertRes = $this->executeInsert($insert);

Bu iş.

 $query = 'INSERT INTO ' . $db->quoteIdentifier('table') . ' (`col1`, `col2`) VALUES ';
    $queryVals = array();
    foreach ($data as $row) {
        foreach($row as &$col) {
            $col = $db->quote($col);
        }
        $queryVals[] = '(' . implode(',', $row) . ')';
    }
    $stmt = $db->query($query . implode(',', $queryVals));

how to build multiple insert query in zend framework