background
CMS

drupalのDBのデータを取得し、csvに出力してみた!

2020/12/25公開
drupalのDBのデータを取得し、csvに出力してみた!

Drupalのデータベースに対して単純なSELECT文を実行してデータを取得し、取得したデータをcsvとして出力する方法について紹介しています。

各実装に対してソースの例も記載しているので、ぜひ参考にしてみてください。

drupalのDBからデータを取得

SELECT文を実行し、drupalのDBからデータを取得した後、実行結果を変数に格納する手順です。


$database = \Drupal::database();
$result = $database->query("ここに実行するクエリを記載します。");

------ソース例------------------------------
// 接続オブジェクトをインスタンス化する。
$database = \Drupal::database();

// インスタンス化したデータベース接続オブジェクトのqueryメソッドを使い、クエリを実行する。
$result = $database->query("SELECT * FROM TABLE_NAME");
------------------------------------------

データベース接続オブジェクトをインスタンス化した後、queryメソッドでクエリを実行しています。
$result変数に、クエリ実行結果のすべての行が格納されています。

単純なSELECTをする場合であれば、queryメソッドを使用すればよいのですが、INSERT、UPDATE、DELETEの際はそれぞれinsertメソッド、UPDATEメソッド、DELETEメソッドが用意されているため、そちらを使用する必要があります。
queryメソッドは、あくまで静的なクエリを実行する際のメソッドです。

取得データを出力する形に加工する

取得データに対して区切り文字などを付与し、最終的に出力したい形に加工する手順です。

csvファイルで出力する際には、取得したデータをカンマ区切りなどで出力することが多いかと思います。
以下は、取得したデータをカンマ区切り、改行コードCRLFで出力する例を記載しています。

ソース例:

  // 出力するcsv用の変数を用意
      $result_csv = '';
      
  // fetchAssocメソッドで、取得したデータを連想配列として$assoc変数に格納する
      for($i=0; $assoc = $result->fetchAssoc() ;$i++) {

// $assocに格納された配列データを、improdeメソッドでカンマ区切りにし、$result_csv変数に格納する
// 改行コードは、\r(CR)、\n(LF)、\r\n(CRLF)
    $result_csv = $result_csv . implode('","', $assoc) . "\r\n";
  }

  if($i > 0){
// 必要に応じてmb_convert_encodingメソッドなどでエンコードする。
    $result_csv = mb_convert_encoding($result_csv, 'sjis', 'UTF-8');
  } else {
    // SELECT結果が0件の場合
          return false;
  }
  

上記の例では、fetchAssocメソッドで、取得した$resultから各行を連想配列として$assoc変数に返しています。
$assocに連想配列として格納された各行のデータを、improdeメソッドによりカンマ区切りに加工しています。

データを取得した際にUTF-8で取得されているため、上記の例ではmb_convert_encodingメソッドを用いてSJISにエンコードしています。

任意の場所にcsvファイル作成、出力データ書き込み

任意の場所にcsvファイルを作成し、上記で取得・加工したデータを書き込む手順です。

ソース例:

    $file_name = /csv_data/data.csv

    // fopenメソッドで、作成するファイルパスを指定しファイルを作成する。
    // 'w'は書き出しモードの指定
    $fp = fopen($file_name, 'w');

        if($fp){
        // 加工後データ$result_csvを、作成したファイルに書き込む。
            fwrite($fp, $result_csv);

        // ファイルを閉じる。
            fclose($fp);
            unset($fp);
        } else {
            return false;
        }

fopenメソッドでは、第一引数に指定されたファイルをオープンします。
第二引数はパラメータmodeで、「読み込み」「書き出し」「読み込み/書き出し」などを指定してファイルをオープンできます。
上記の例では、書き出しモードの'w'を指定しており、'w'の場合、ファイルが存在しない場合はファイルを作成します。
パラメータmodeのリストについては、phpのマニュアルサイトを参照してください。

ファイル作成後、fwriteメソッドで加工したデータの書き込みを行っています。
書き込み後、fcloseメソッドでファイルを閉じるのを忘れないようにしましょう。

まとめ

以上、DrupalのDBからデータを取得し、csvに出力する方法でした。
csvの区切り文字や改行コードなどについては、必要に応じて変更してください。