2013-06-26 103 views
6

我想知道是否有一種方法只使用一個$ sql對象(而不使用查詢(SQL COMMAND)方法)在ZF2中插入多行。ZF2插入多行

我想這樣的事情,但它不工作:

public function setAgentProjectLink($IDProject , $IDsAgents) 
{ 
    $values = array() ; 
    foreach ($IDsAgents as $IDAgent): 
    { 
     $values[] = array ('id_agent' => $IDAgent , 'id_projet' => $IDProject) ; 
    } endforeach ; 

    $sql = new Sql($this->tableGateway->adapter) ; 
    $insert = $sql->insert() ; 

    $insert -> into ($this->tableGateway->getTable()) 
      -> values ($values) ; 

    $statement = $sql->prepareStatementForSqlObject($insert); 
    $result = $statement->execute(); 
} 

試圖插入數據庫中的值有兩列(id_agent, id_projet

+1

由於多個插入是MySQL功能,而不是標準的SQL插入類型,所以不會有使用數據庫抽象的通用方法。 – Andrew

+0

感謝您的回覆(抱歉,非常遲到的答案)。我發現在這種情況下解決我的問題的更好的解決方案是使用zf2 sql事務。 – aramir

+0

是的,在使用zf2 sql事務後,您必須在值()中傳入'set'參數,如 $ insert - > into($ this-> tableGateway-> getTable()) - > values($ values, 'set'); – prava

回答

4

有在ZF2 multyinsert沒有通用的方法但如果你正在使用mysql而不打算更改爲其他數據庫,我已經爲自己編寫了一個multiInsert函數:

$data是一個數組鍵值對。

protected function multiInsert($table, array $data) 
    { 
     if (count($data)) { 
      $columns = (array)current($data); 
      $columns = array_keys($columns); 
      $columnsCount = count($columns); 
      $platform = $this->db->platform; 
      array_filter($columns, function ($index, &$item) use ($platform) { 
       $item = $platform->quoteIdentifier($item); 
      }); 
      $columns = "(" . implode(',', $columns) . ")"; 

      $placeholder = array_fill(0, $columnsCount, '?'); 
      $placeholder = "(" . implode(',', $placeholder) . ")"; 
      $placeholder = implode(',', array_fill(0, count($data), $placeholder)); 

      $values = array(); 
      foreach ($data as $row) { 
       foreach ($row as $key => $value) { 
        $values[] = $value; 
       } 
      } 


      $table = $this->db->platform->quoteIdentifier($table); 
      $q = "INSERT INTO $table $columns VALUES $placeholder"; 
      $this->db->query($q)->execute($values); 
     } 
    } 
+0

工程就像一個魅力....非常感謝! –