[laravel] doctrine/dbalを入れたのに「Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found」と言われる

DB設計の変更により
テーブルのカラムの型変換をしようとしました。

```database/migrations/2020_11_17_203408_modify20201117_stations_table.php
    public function up()
    {
        //
        Schema::table('stations', function (Blueprint $table) {
            $table->smallInteger('xxxxx')->nullable()->default(NULL)->change();
        });
    }
```

`php artisan migrate` するとエラーが出ました。

```
Migrating: 2020_11_17_203408_modify20201117_stations_table

   RuntimeException 

  Changing columns for table "stations" requires Doctrine DBAL. Please install the doctrine/dbal package.
```

おっといかん、doctrine/dbal を入れないまま change() してしまったか…
composerでインストールせねば

```
$ composer require doctrine/dbal

Using version ^3.0 for doctrine/dbal
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 4 installs, 0 updates, 0 removals
...
```

よし入った
改めて`php artisan migrate`

```
Migrating: 2020_11_17_203408_modify20201117_stations_table

   Error 

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

ん？

え、今入れたよね？
あ、エラーの内容が最初と違う？

該当のファイルが存在しないとのことなので
vendor以下を確認してみる

```
$ ll vendor/doctrine/dbal/src/Driver/
...
-rw-rw-r--. 1 vagrant vagrant  168 Nov 15 18:20 Middleware.php
drwxrwxr-x. 4 vagrant vagrant  144 Nov 15 18:20 Mysqli
drwxrwxr-x. 3 vagrant vagrant  175 Nov 15 18:20 OCI8
drwxrwxr-x. 7 vagrant vagrant  153 Nov 15 18:20 PDO
-rw-rw-r--. 1 vagrant vagrant 2497 Nov 15 18:20 Result.php
-rw-rw-r--. 1 vagrant vagrant  397 Nov 15 18:20 ServerInfoAwareConnection.php
...
```

なるほど、`PDO`はあるけど`PDOMySql`はないな。

```
$ ll vendor/doctrine/dbal/src/Driver/PDO/
...
-rw-rw-r--. 1 vagrant vagrant  591 Nov 15 18:20 Exception.php
drwxrwxr-x. 2 vagrant vagrant   24 Nov 15 18:20 MySQL
drwxrwxr-x. 2 vagrant vagrant   24 Nov 15 18:20 OCI
drwxrwxr-x. 2 vagrant vagrant   24 Nov 15 18:20 PgSQL
...
```

`PDO`ディレクトリの下に`MySQL`があるな…
えーとつまり、バージョンが変わって、ディレクトリの構成が変更になったとかそういうことかな？

https://github.com/doctrine/dbal

3.0系の構成を確認してみる
https://github.com/doctrine/dbal/tree/3.0.x/src/Driver
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108345/034bb156-d5ae-e79f-60ec-d7db326a5b7b.png)

うん、インストールされているのはこの構成だ。
では前のバージョンは…

https://github.com/doctrine/dbal/tree/2.12.x/lib/Doctrine/DBAL/Driver

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108345/51d31c7a-240a-4475-d8f8-6ec9e4f1414d.png)

**あっPDOMySqlさんいる**

えーとつまり

- `composer require doctrine/dbal`だけでインストールすると、今は3.x系が入ってしまう
- 3.x系は`Driver`ディレクトリの構成が変わっているので、migrateする時に2.x系にあった`PDOMySql`がnotfoundになる

ということか

```
$ composer require "doctrine/dbal:2.*"

./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Downgrading doctrine/dbal (3.0.0 => 2.12.1): Downloading (100%)     
...
```
```
$ php artisan migrate
Migrating: 2020_11_17_203408_modify20201117_stations_table
Migrated:  2020_11_17_203408_modify20201117_stations_table (133.37ms)
```

doctrine/dbal をバージョン指定で入れ直し、無事migrateできました。


※バージョンによる今だけの一時的な現象だと思いますが、そこそこ迷走したので、誰かの手助けになれば。