記入日: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化のディレクションなどを行っています。