UI設計したり、ウェブシステムを開発したりします。 

SQL見るだけクエリ#028 二次元配列をバルクインサートするクラス PHP

記入日:2023-02-05 編集日:2023-02-05

SQL見るだけクエリ。今回は、二次元配列をバルクインサートするクラスを考えてみようと思います。

以下がクラスになります。

class BulkInsert
{
    // データベース接続情報
    protected $db;
    // テーブル名
    protected $tableName;
    // 対象データ
    protected $data;
    // 対象カラム
    protected $columns;

    // コンストラクタ
    public function __construct($db, $tableName, $data, $columns){
        $this->db = $db;
        $this->tableName = $tableName;
        $this->data = $data;
        $this->columns = $columns;
    }
    
    // バルクインサートする
    public function bulkInsert(){
        // インサート文を作成
        $query = $this->createQuery();
        // クエリを実行
        $result = $this->db->query($query);
        // 成功したかどうか
        return $result;
    }

    // インサート文を作成
    protected function createQuery(){
        // テーブル名
        $tableName = $this->tableName;
        // データ
        $data = $this->data;
        // テーブルカラム
        $columns = $this->columns;
        // インサート文作成
        $query = "INSERT INTO {$tableName} (";
        foreach ($columns as $key => $value) {
            $query .= $value . ',';
        }
        $query = rtrim($query, ','); // 最後のカンマを削除
        $query .= ") VALUES";
        foreach ($data as $row) {
            // 各行を引数にインサート文を作成
            $query .= $this->createRowQuery($row);
        }
        // 最後のカンマを削除
        $query = rtrim($query, ',');
        return $query;
    }
    
    // 各行のインサート文を作成
    protected function createRowQuery($row){
        // 各行の値を作成
        $values = '';
        foreach ($row as $value) {
            // 値の型によって変換
            $values .= is_string($value) ? "'{$value}'" : "{$value}";
            $values .= ',';
        }
        // 最後のカンマを削除
        $values = rtrim($values, ',');
        return "({$values}),";
    }
}

まず、BulkInsertクラスが定義されています。
コンストラクタでは、$db、$tableName、$data、$columnsを引数として受け取り、プロパティに格納します。

次にbulkInsertメソッドが定義されています。
このメソッドでは、createQueryメソッドを使用してインサート文を生成し、$dbのqueryメソッドを使用して実行します。

そして、createQueryメソッドが定義されています。
このメソッドでは、$tableNameを使用してテーブル名を指定し、$dataをもとに各行の値を生成し、インサート文を作成します。

最後に、createRowQueryメソッドが定義されています。
このメソッドでは、$rowをもとに各行の値を生成し、インサート文を作成します。

return "({$values}),"; は、
$valuesに格納された値をカンマで区切って、インサート文を作成するための文です。

$values .= is_string($value) ? "'{$value}'" : "{$value}"; は、
$valueが文字列かどうかを判断し、文字列であればシングルクォーテーションで囲むようにして、$valuesに格納するための文です。

createRowQueryメソッドの具体例
例えば、$rowには以下の値が入っているとします。

$row = array(
    'AAA',
    'BBB',
    123
);

この場合、createRowQueryメソッド内では以下のようになります。

// 各行の値を作成
$values = '';
foreach ($row as $value) {
    // 値の型によって変換
    $values .= is_string($value) ? "'{$value}'" : "{$value}";
    $values .= ',';
}
// 最後のカンマを削除
$values = rtrim($values, ',');
return "({$values}),";

// 実行結果
$values = "'AAA','BBB',123";
return "('AAA','BBB',123),";

使用例

// 二次元配列
$data = [
  ['apple', 1],
  ['banana', 2],
  ['grape', 3],
];

// テーブルカラム名
$columns = [
    'name',
    'num'
];

// テーブルカラム名
$tablename = 'fruit_table';

// DB接続情報
$host = 'localhost';
$dbname = 'db_name';
$charset = 'utf8';
$username = 'username';
$password = 'password';
$dsn = 'mysql:host='.$host.';dbname='.$dbname.';charset='.$charset;

// PDOインスタンス作成
$pdo = new PDO($dsn, $username, $password);
// オブジェクト作成
$bulkInsert = new BulkInsert($pdo, $tablename, $data, $columns);
// バルクインサート実行
$result = $bulkInsert->bulkInsert();
// 接続を閉じる
$pdo = null;

上記を実行すると、例えば、以下のようなインサート文が作成され、バルクインサートされます。

INSERT INTO fruit_table (name, num) VALUES('apple', 1), ('banana', 2), ('grape', 3);

SQLの使いどころ

サイトに大量の情報を掲載することは、ユーザーにとってとても便利なことです。しかし、情報が多すぎると、目的の情報を見つけるのが困難になります。そのため、SQLを使用することで、情報を効率的に管理することができます。

SQLを使用することで、データベース内の情報を検索したり、フィルタリングしたりすることができます。これにより、ユーザーは目的の情報をスムーズかつ簡単に見つけることができます。

また、SQLを使用することで、データを集計したり、統合したりすることもできます。これにより、ユーザーはさまざまな視点から情報を分析することができます。つまり、サイトに多くの情報を掲載することが重要である一方で、その情報を効率的かつ簡単に管理することが求められる場合には、SQLが不可欠であるといえます。

KK

機械工学を専攻。工業デザイナーとして、国内及び海外の自動車・搬送ラインの設計などに従事した後、2003年にウェブシステム会社を設立。UI設計やウェブシステムの開発、DX化のディレクションなどを行っています。