2013-06-26 3 views
6

Я хотел бы знать, есть ли способ вставить несколько строк в ZF2, используя только один объект $ sql (и не используя метод SQL COMMAND).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 -> in ($ this-> tableGateway-> getTable()) -> values ​​($ values, 'задавать') ; – prava

ответ

4

нет универсального способа для multyinsert в ZF2 НО, если вы используете 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

Работает как очарование .... Большое спасибо! –