目次
はじめに
PostgreSQLからMySQLへの置き換え(マイグレーションファイル)とXAMPP(MySQL)でPostgreSQLを使う方法についてまとめました。
動機
問題は下記の教材で起きました。教材はDocker(PostgreSQL)での開発です。
私はXampp(MySQL)で試したので置き換える必要があったからです。
※以下、当時ハマった際の投稿。

※ご自身の教材などに置き換えて参考にしていただければ幸いです。
PostgreSQLからMySQLへの置き換え
以下が解決法です。
解決策
PostgreSQLからMySQLに置き換えるには外部キー制約関連で違いがあり、負の値の無い数値型にするのがポイントです。
具体的にはMySQLでは、外部キーとなる数値項目にはunsigned;(負の値のない数値型)を付けることで解消します。
マイグレーションファイルを以下のように編集。
$table->bigIncrements('id');
$table->string('title');
$table->text('body');
$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->timestamps();
原因
そもそもなぜこのような原因が起きたか。以下記事参考。
【メモ】【Laravel】外部キー制約付きMigrateがさっぱり動かないときのチェック・ポイント(Mysql)
increments()
で作ったカラムには、裏でunsined(符号無し)属性
が付与される。要は自動採番項目なので正の値しか登録できないわけだが、役割テーブル側の
user_id
とauthority_id
には同様の制約を付けていない。
つまり、外部キー側でも正の値しか登録できないようにunsigned();を付けて形式を一致させる必要があったとのこと。
補足
unsigned()を付けて、php artisan migrateで以下のようなエラーが出た場合。
パターン①
SQLSTATE[HY000]: General error: 1005 Can't create table `laravel_vue_sns`.`articles` (errno: 150 "Foreign key constraint is key (`user_id`) references `users` (`id`))
⇒laravel_vue_sns
.articles
を作成できません(errno:150″外部キー制約はキー( user_id
)はusers
( id
)を参照します)
パターン②
SQLSTATE[HY000]: General error: 1005 Can't create table `laravel_vue_sns`.`articles` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter tarticles` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `articles` add constraint `articles_user_id_foreign` foreign key (`user_id`) references `users` (`id`))
⇒laravel_vue_sns
.articles
を作成できません(errno:150″外部キー制約の形式が正しくありません “)(SQL:alter tarticles(errno:150"外部キー制約が正しくありません (SQL:変更テーブル
articles制約の追加
articles_user_id_foreign外部キー(
user_id)参照
users(
id`))
解決法
phpMyAdmin側でDBを完全に消せているか確認すること。
どうやら一度migrateでエラーが出るとmigrate:rollbackしてもテーブルは残ってしまうことがあるみたいです。
その際はコマンドではなくphpMyAdmin側でテーブルをdropしてからmigrateをやり直せば解決します。
XAMPPでPostgreSQLを使う方法
以下からはXAMPPでPostgreSQLを使う形に挑戦してみました。
参考:XamppとPostgreSQLの連携 ⇒ PHPファイルからPostgreSQLまでのつなぎ方が記載されています。
ざっくりこんな内容です。

その後、Laravelに紐づけるためには.envファイルを編集する必要があります。
DB_CONNECTION=pgsql DB_HOST=localhost DB_PORT=5432 DB_DATABASE=test DB_USERNAME=postgres DB_PASSWORD=secret(ここはご自身で設定したパスワードを記載してください。)
僕の場合はこんな感じです。
別途、データベースを用意する必要があるのでデータベースを作成。
psql -U postgres -c "create database test;
その後、マイグレーション。

無事、マイグレーションすることができました。
おわりに
以前書いた記事を修正しました。
これでもちょっとわかりづらいかもしれないので、ちょっとずつ改良していきます。。。
知識不足の状態で記事書くとめちゃくちゃなこと書いてたりするから骨が折れる。。。
参考
当時嘆いていたところやんばるさん(著者)から解決策をご教授いただきました。
本当にありがとうございました。

Laravel5.8は、マイグレーションスタブの主キーのデフォルトが、increments()からbigIncrements()になった
コメントを残す