代码之家  ›  专栏  ›  技术社区  ›  Thomaschaaf

如何使用Zend_Db添加多行?

  •  21
  • Thomaschaaf  · 技术社区  · 15 年前

    我有一个数组,其中的信息大致如下:

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

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

    不同时添加两个条目。我做错什么了?我必须使用Zend_ud_u表吗?

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

    当然是作品

    6 回复  |  直到 15 年前
        1
  •  33
  •   Community Mr_and_Mrs_D    7 年前

    我不认为Zend_Db支持插入多行。

    但是如果你只有两行或者更多,你可以使用一个循环。

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


    Bill Karwin ,前Zend框架开发人员,写道 this on Nabble some time ago :

    行集基本上是一个集合对象,因此我将向该类添加方法以允许向该集合添加行。所以你应该能够做到:

    // 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(); 
    

    将整数传递给createRowset()以创建N个空行是没有意义的。无论如何,您只需遍历它们就可以用值填充它们。因此,您不妨编写一个循环,用应用程序数据创建和填充各个行,然后将它们添加到集合中。

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

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

    这将执行与上一个示例相同的循环(除了末尾的save()之外),创建一个新的行集,即save()d。

    在SQL中,有两种方法可以提高插入数据的效率:

    1. 插入t(col1,col2,col3)值(1,2,3),(4,5,6),(7,8,9);

    2. 准备INSERT语句并多次执行:

      执行1,2,3 执行4,5,6 执行7,8,9

    无论如何,在一个典型的web请求中批量加载多行数据是非常罕见的,因为这时最需要高效的SQL。少量行的效率差异很小,因此只有在批量加载大量行时,效率才会有显著的提高。如果是这样,那么无论如何都不应该使用INSERT,应该使用MySQL的LOAD DATA语句,或者如果使用其他RDBMS品牌的等效功能。对于加载大量数据,INSERT通常不是最有效的选择。

    关于返回自动生成的密钥,我不介意。注意,如果使用普通SQL(例如在mysql CLI中),并且在单个insert语句中插入多行,则只能获取最后生成的id值,而不能获取插入的所有行的id值。这是SQL行为;对于任何语言或任何框架都是如此。

    INSERT INTO t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
    SELECT LAST_INSERT_ID(); -- returns only the id for the third tuple
    

        2
  •  19
  •   Bill Karwin    15 年前

    您可以执行任何想要的SQL语法——包括多行 INSERT Zend_Db_Adapter_Abstract::query() 方法。

    但是 Zend_Db_Table Zend_Db_Table_Rowset

        3
  •  13
  •   risnandar    13 年前

    要插入多行,可以使用Zend_Db

    $stmt = $table->getAdapter()->prepare('INSERT INTO tablename (col1, col2, col3) VALUES (?, ?, ?), (?, ?, ?)');
    
    $stmt->execute( array($value1, $value2, $value3, $value4, $value5, $value6) );
    

    (来自比尔·卡温)

    在您的情况下,我们可以将其更改为以下代码:

    $data[] = array('content'=>'asd');
    $data[] = array('content'=>'asdf');
    
    $stmt = $table->getAdapter()->prepare('INSERT INTO table (col1) VALUES (?), (?)');
    $stmt->execute( $data );
    

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

    希望这有帮助

    里基·里斯南达

        4
  •  3
  •   ovnia    11 年前

    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);
        }
    
        5
  •  1
  •   Sergei Khaletskiy    11 年前

    如果您确实使用ZF2,则解决方案可能如下:

    $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);
    
        6
  •  1
  •   Community Mr_and_Mrs_D    7 年前

     $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