PHP: Laravel5でMicrosoft Accessのmdbファイルに接続する

BPSの福岡拠点として一緒にお仕事させて頂いてます、株式会社ウイングドアの坂本です。

前回はLaradockの話を書かせて頂いたのでLaravelネタを続けてみます。
とはいえってもブログのネタにできるほどLaravelは最近触れておらず、
今回は過去にLaravel5.2でAccessへの接続した時の話をしたいと思います。

経緯

ある案件で既存システムとの兼ね合いでどうしてもMicrosoft Access(mdbファイル)への参照と更新が必要になりました。
Laravelから直接DBを更新するのどうなのだろうか…と思いつつ既に複数のDBや言語、ツールが絡んでいてこれ以上増やしたくない状態。
他に最適な方法があるかもしれないと思いつもLaravelからごにょごにょすることに。

しかしながら検索してみても当時LaravelからAccessの接続のライブラリが見つからない!!
ということで既存のライブラリを参考に実装してみました。

環境

ちなみにその時の環境は以下の通り

  • OS windows(8?)
  • Laravel 5.2
  • Accessのmdbファイルとシステムは同じサーバにあること前提

余談ですがこの時の開発環境はNetBeansです。(未だにPHPのIDEは迷ってます)

方針

今回は予めODBCでmdbファイルの登録をしておき、ODBC経由でLaravelからアクセスする、という方法を取りました。

参考: Accessデータベースの配置とODBCの設定

あくまで補助機能であったのでコストはかけたくない、ということでライブラリの実装については以下のように方針を決定。

  • vendorファイルは汚したくない!
  • 特殊な事例が多々絡んでいるので、再利用することは考えない、仕様の変更があれば都度修正すること前提
  • 既存のクラスで済むものはそのまま利用
  • 仮に一般的にDBのライブラリとして必要なものでも、今回利用しないところは修正、追加しない!

(使うところだけ正しく動けばいい)
コストと勢い優先です。

結果

  1. 以下のファイルを作成してconfig/app.phpでサービスプロバイダを設定。
  2. 紐付けたいdbのdriverにmdbの設定
  3. 対象のモデルに作成したMDB用のModelを継承させる

これでmysqlなどと同じようにモデル経由で参照/更新ができるようにしました。

追加ファイルしたファイルとその概要は以下の通り

  • Query/Grammars/MdbGrammar: 利用するSQL文の語句などの定義を修正
    • (継承元) Illuminate\Database\Query\Grammars\Grammar

こんな感じで使う語句の指定やmdbファイル用に調整が必要なものを修正しました。

  • Query/Processors/MdbProcessor
    MdbGrammarと同様にSQL周りの微修正 Insertしたあとにidが取得できずエラーになっていたので修正しました。

    • (継承元) Illuminate\Database\Query\Processors\Processor

  • Query/Builder: (継承元)Illuminate\Database\Query\Builder

以下はほとんどMysqlなどのライブラリそのままです。
上記のクラスを利用するよう設定仕様とすると、かなり多くのファイルを用意することになりました。

  • Connection: MdbGrammar/ MdbProcessorを利用するように修正
    • (継承元)Illuminate\Database\Connection
  • ConnectionFactory: ドライバがmdpの場合にConnection 、MdbConnectorを呼び出すように修正
    • (継承元)Illuminate\Database\Connectors\ConnectionFactory
  • DatabaseManager: MdbConnectionFactoryを利用するよう修正
    • (継承元)Illuminate\Database\DatabaseManager
  • MdbConnectionFactory: MdbDatabaseManager を提供するように修正
    • (継承元) Illuminate\Database\Connectors\ConnectionFactory
  • MdbConnector: odbc経由でPDOを使って接続できるように修正
    • (実装元)Illuminate\Database\Connectors\ConnectorInterface

  • MdbServiceProvider: サービスプロバイダ。これをconfig/app.phpの$providersに追加する
    • (継承元)Illuminate\Support\ServiceProvider
  • Model: 特に修正なし
    • (継承元)Illuminate\Database\Eloquent\Model

感想

調査してみると案外既存の構文などそのまま利用できそうで、簡単な参照、更新のみでしたら少しの調整で済むのですが、
そのクラスを利用するために複数もファイルを作成しなければならず、そこに行き着くまでが長かった。
しかしながら一度設定するとあとはほとんどDB意識せずに更新や参照ができたので楽でした。
なにより既存のフレームワークの処理を追ってい実装していくのが楽しい!
そういう経緯などを経て思い入れの深い案件になりました。


株式会社ウイングドアでは、Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。

関連記事

PHP: Laradockちょっとだけ触ってみた

PHP5.6のセキュリティサポートが2018年末まで!PHPバージョンアップしよう

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

wingdoor

株式会社ウイングドアは福岡のシステム開発会社です。Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、 スマホアプリや業務系システムなど様々なシステム開発を承っています。 中途採用を絶賛募集しています! https://wingdoor.co.jp/

wingdoorの書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ