2019年になってから、ありがたいことにたくさんのプロジェクトに参加させていただき、ようやく一段落ついたので久しぶりになってしまいましたがブログを書こうと思います。APIを利用したD6データベースのマイグレーションというのを書かせて頂きました。APIを用いて実装させて頂きましたので、そこで学んだことをアウトプットの意味も込めてブログにさせて頂きます。APIを用いてCSVインポートを行いたいと思います。CSVファイルや画像を置く位置について特に決まりはなく、YAMLファイルの書き方で調整できるのでわかりやすいところに置いてください。└──migration_imagetest-node.csvtitle,body,imageテストコンテンツ,こちらはマイグレーションのテストコンテンツです。test.jpgtest-image.csvfile_nametest.jpgマイグレーションを実行するのにYAMLファイルの記載の仕方を理解することが必要不可欠です。ことはYAMLファイルの記載だけでマイグレーションを実行することが出来ます。今回は画像のマイグレーションとノードのマイグレーションを実行するYAMLファイルを記載してみました。そこで特に自分が学んだなということをお伝えできればと思います。null画像のマイグレーションのYAMLファイルの記載は基本的には上記のような感じになるかと思います。事始めで記載してくださっていますので、こちらをご参照ください。valuesに記載されていますが、固定値を設定しています。今回の例ではマイグレーションさせたい画像をmigration_imageフォルダーに格納しており、それをpublic:/下に置いていることを仮定して話を進めて行きます。上記の記載では、source_file_pathキーにpublic://migration_imageとfile_nameを/でconcatした値が入ります。constants/destination_directoryコアのプラグインfile_copyを利用して、'@source_file_path'(上記のsource_file_pathを別の場所で利用したい場合先頭に@をつける)からconstants/destination_directory(public://2019-08)にファイルがコピーされ、uriはpublic://2019-08/test.jpgとしてファイルエンティティが登録されます。確認するとtest.jpgが存在していることが分かるかと思います。DBの方も確認してみましょう。マイグレーションを実行するとmigrate_map_migration_imageテーブルが新たに作成されているかと思います。いうようなものが確認できるかと思います。sourceid1はkeysに指定したもの(今回はfile_name)の値が入ります。8にファイルエンティティとして登録したので、この場合はfidの値になります。6で登録されていますよということが明示されています。本当にそうなのかfile_managedテーブルで確認してみましょう。public://2019-08/test.jpgとなっていることが分かると思います。destid1はnodeならnid、userならuid、taxonomyならtidということになります。これが大まかな画像のマイグレーションです。事始めで記載してくださっています。ここでご紹介したいのはmigration_lookupについてです。このpluginは非常に便利ですので、覚えておいて損は無いと思います。これはどういう機能を提供するプラグインかと言いますと、指定されたmigrationのidから同一の値があるかを検索し、存在すればエンティティ同士を紐付けてくれます。imagemigrationでid(マイグレーション時に設定したid)を記載します。migration_imageで画像のマイグレーションを行っていたのでimageの値と同様のものがmigrate_map_migration_imageのsourceid1にあるか確認し、存在していればそれをdestidに変換してfield_imageにdestid1の値が入ります。流れは以下のようになります。↓field_imageには6という値を入れる。6の画像が紐付けられ、ノードの詳細ページを確認すると、マイグレーションした画像が閲覧出来るかと思います。以上が画像とノードのマイグレーションの説明になります。APIを利用してみて感じたことpluginなどが豊富なので形さえ覚えられれば、YAMLファイルを書くだけで基本的にはマイグレーション実行できる。YAMLファイルだけでは対応できないこともカスタムプラグインを作成すればカバーできることが増えるので応用が効く。コントリビュートモジュールなどでのインポートではエンティティの紐付けを行うのは難しいが、migration_lookupを使用することでエンティティ同士の紐付けも同時に出来るのはすごく便利。コマンド1つでインポートやロールバックなども可能。注意点sourceid1が重複したものがマイグレーションされていると、migration_lookupを使用した際に意図しない動きになるのでそこは注意が必要になります。重複しないものをキーとして設定することを心がけなくてはいけません。APIを用いてマイグレーションしているものが対象になるため、事前に登録されている画像やコンテンツなどを紐付ける事はできないため、そこはカスタムプラグインなどを作成して対応する必要があります。APIを用いた画像やノードのマイグレーションをご紹介させて頂きました。APIを使うことで出来るので、ぜひ利用してみてください。使い分け方スタジオ・ウミは13年以上の実績を誇るDrupal専門の開発会社です。豊富な知見とノウハウでDrupalサイトの開発や技術サポートなどDrupal関連サービスをワンストップでご提供します。RECRUIT新たなステージを共に歩んでいけるコアメンバーを募集しています採用情報CONTACTお仕事のご相談やお見積依頼など、お気軽にお問い合わせください。お問い合わせDOWNLOAD会社案内やDrupalについての資料をご用意しています。