◀ 6.

Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

▶
この記事の要点
  • Laravel のマイグレーション(カラム変更・リネームなど)で出る Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
  • 原因 1: doctrine/dbal が未インストール(古い Laravel ではこのメッセージになる)
  • 原因 2: DBAL 3 系と古い Laravel の組み合わせ。DBAL 3 でこのクラスは別名に移動している
  • 対処: 未導入なら composer require doctrine/dbal、バージョン不一致なら composer require doctrine/dbal:^2.13 か Laravel を更新
  • Laravel 11 以降はカラム変更に DBAL を使わないため、このエラー自体が起きない

エラー内容

Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

PHP 8 系では Class "Doctrine\DBAL\Driver\PDOMySql\Driver" not found のようにダブルクォートで表示されます。php artisan migrate の実行中に発生し、マイグレーションが途中で止まります。

発生条件

既存テーブルの構造を読み取る必要があるマイグレーションを実行したときに発生します。代表的なのは次の操作です。

  • $table->string('name', 100)->change(); … カラムの型・長さ・NULL 許可などの変更
  • $table->renameColumn('old', 'new'); … カラム名の変更
  • SQLite でのカラム削除(dropColumn)

Laravel 10 以前のスキーマビルダーは、これらの処理で Doctrine DBAL に現在のテーブル定義を読ませ、差分から ALTER 文を作っていました。その際に MySQL 用のドライバクラス Doctrine\DBAL\Driver\PDOMySql\Driver を生成しようとして、クラスが見つからないと今回のエラーになります。

原因の切り分け

状況原因対処
composer show doctrine/dbal で「not found」doctrine/dbal が入っていないcomposer require doctrine/dbal
DBAL 3.x が入っていて、Laravel が 7 以前DBAL 3 で PDOMySql\Driver が廃止され、Doctrine\DBAL\Driver\PDO\MySQL\Driver に移動した。古い Laravel は旧クラス名を参照しているDBAL を 2 系に固定するか、Laravel を DBAL 3 対応版へ更新
ローカルでは動くが本番だけ失敗dbal を require-dev に入れていて、本番は --no-dev でインストールしている通常の require に移す

同じ「DBAL が無い」という原因でも、操作の種類や Laravel のバージョンによっては「Changing columns for table ... requires Doctrine DBAL」という別のメッセージになります。どちらのメッセージでも、まず DBAL の有無とバージョンを確認するのが近道です。

対処法

doctrine/dbal が入っていない場合

composer require doctrine/dbal
php artisan migrate

DBAL 3 と古い Laravel の組み合わせの場合

Laravel をすぐに更新できないなら、DBAL を 2 系に固定します。

composer require doctrine/dbal:^2.13
php artisan migrate

根本的には Laravel 自体のアップデートを検討してください。古いバージョンはセキュリティサポートも終了しています。

Laravel 11 以降へ移行した場合

Laravel 11 以降はカラム変更・リネームを Laravel 自身が処理するため、doctrine/dbal は不要です。ただし change() では残したい修飾子(nullable・default・comment など)をすべて書き直す必要がある点に注意してください。

どうしても DBAL を入れたくない場合

MySQL 8.0 以降なら、マイグレーション内で ALTER 文を直接実行する方法もあります。

use Illuminate\Support\Facades\DB;

public function up(): void
{
    DB::statement('ALTER TABLE users RENAME COLUMN old_name TO new_name');
    DB::statement('ALTER TABLE users MODIFY name VARCHAR(100) NULL');
}

この方法は DB 製品に依存するため、テストで SQLite を使っている場合などは動かなくなる点に注意してください。

確認方法

# DBAL の有無とバージョン
composer show doctrine/dbal

# Laravel のバージョン
php artisan --version

# どこまで適用されたか
php artisan migrate:status

MySQL では DDL がトランザクションでロールバックされないため、エラーで止まったマイグレーションの前半だけが適用されていることがあります。再実行前に SHOW CREATE TABLE で現状を確認してください。

よくある質問

Q. composer require したのにまだ同じエラーが出る
A. Composer のオートロードが古いままの可能性があります。composer dump-autoload を実行してから再度マイグレーションしてください。Docker などでコンテナ内とホストの vendor が別になっている場合は、実際に artisan を実行する環境にインストールされているかも確認します。

Q. composer require で依存関係の競合エラーになる
A. Laravel や他パッケージが要求する DBAL のバージョンと、指定したバージョンが合っていません。composer why-not doctrine/dbal 3.0 のようにして、どのパッケージが制約しているか調べられます。

Q. 本番環境だけで発生する
A. composer install --no-dev でデプロイしていて、doctrine/dbal が require-dev 側に入っていないか composer.json を確認してください。

関連

子ページ

子ページはありません

同階層のページ
  1. SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost'
  2. Add [~] to fillable property to allow mass assignment on [App\~].
  3. PHP Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in ~
  4. Changing columns for table "~" requires Doctrine DBAL; install "doctrine/dbal"
  5. MethodNotAllowedHttpException No message
  6. Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
  7. production.ERROR: No application encryption key has been specified.
  8. Dotenv values containing spaces must be surrounded by quotes.
  9. Laravel \ Socialite \ Two \ InvalidStateException
  10. The page has expired due to inactivity. Please refresh and try again.
  11. Failed to clone https://github.com/symfony/thanks.git via https, ssh protocol
  12. Illegal offset type
  13. Cannot access protected property Illuminate\Http\Request::$...
  14. Emitted value instead of an instance of Error
  15. 画像保存時にInternal Server Error
  16. Failed to authenticate on SMTP server with username ...
  17. PostTooLargeException
  18. Database hosts array is empty.
  19. Invalid request (Unsupported SSL request)
  20. does not comply with psr-4 autoloading standard. Skipping.
  21. MySQLのSTR_TO_DATE関数を使用するとnullが返却される問題