8

$sql オブジェクトを 1 つだけ使用して (query(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();
}

2 つの列を持つデータベースに値を挿入しようとしています ( id_agent, id_projet)

4

1 に答える 1

7

ZF2 で multiinsert の一般的な方法はありませんが、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);
        }
    }
于 2014-01-06T06:31:16.330 に答える