存在はしてないんでしょうか?
もしかしたら、紹介しているマイグレーションファイルではない内容のsqlが流れている気がするので、
$ php artisan migrate:status
これ実行してNoと表示されているマイグレーションファイルがあるか確認してみてください。
もし複数あれば、マイグレーションファイルを作成した順番にNoのマイグレーションファイルを実行していくことになるので、どっかでフィールドがダブっているんじゃないでしょうか?
Laraval usersテーブルを更新したいです。
現在Laravelを使用してマイグレーションファイルをつくっています。
既存の「usersテーブル」に変更を加え、マイグレーションした際にエラーが発生しました。
Illuminate\Database\QueryException
SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'last_name' (SQL: alter table `users` add `last_name` varchar(10) not null, add `first_name` varchar(10) not null, add `employee_num` int unsigned not null, add `admin_flg` tinyint(1) not null default '0', add `job_type_id` bigint unsigned not null, add `hire_date` datetime not null)
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712
708▕ // If an exception occurs when attempting to run a query, we'll format the error
709▕ // message to include the bindings with SQL, which will make this exception a
710▕ // lot more helpful to the developer instead of just the database's errors.
711▕ catch (Exception $e) {
➜ 712▕ throw new QueryException(
713▕ $query, $this->prepareBindings($bindings), $e
714▕ );
715▕ }
716▕ }
・Windows10
・Laravel
・VScode
・mariadb
・Docker(起動た状態で実行)
php artisan make:migration add_columns_to_users_table --table=users
→正常にマイグレーションファイルが作成される
public function up()
{
Schema::table('users', function (Blueprint $table) {
// メアドは50文字までかつ 正の値かつ 一意に変更
$table->string('email',50)->unsigned()->unique()->change();
// パスワードは30文字までに変更
$table->string('password',30)->nullable()->change();
// food_idは正の値かつ user_id の外部キーに指定
$table->bigInteger('food_id')->unsigned()->foreignId('user_id')->constrained('users');
// デフォルトの名前は削除
$table->dropColumn('name');
});
}
composer require doctrine/dbal
→正常に追加される
php artisan migrate
・ Illuminate\Database\QueryException
→データベース関係のエラーである
SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'last_name'
→SQLSTATE [42S21]: 列が既に存在します: 1060 列が重複している
・重複しているということで同じ処理を書いてしまっていないか確認しましたが
記述自体に重複する点は見られませんでした。
またコメントを頂き、以下のコマンドで確認したところNoのファイルは1つのみ(今回作成したマイグレーションファイル)という状態でした。
$php artisan migrate:status
・新しく作ったマイグレーションファイルがDBに接続できていないのではないかと考え、
PCのコマンドプロンプトでSQLが存在するか調べたところインストールされていない状況でした。
(Dockerを使用してサーバーを立ち上げています)
・使用しているDBが「mariadb」(調べたところSQLと近しいDB)のため、
SQLをインストールすることで解決できるのか分かりかねる状況でした。
同じようなエラーを経験した方で、解決できた方法等ありましたら教えて頂けますと幸いです。
存在はしてないんでしょうか?
もしかしたら、紹介しているマイグレーションファイルではない内容のsqlが流れている気がするので、
$ php artisan migrate:status
これ実行してNoと表示されているマイグレーションファイルがあるか確認してみてください。
もし複数あれば、マイグレーションファイルを作成した順番にNoのマイグレーションファイルを実行していくことになるので、どっかでフィールドがダブっているんじゃないでしょうか?
@study_matome
Questioner@study_matome
QuestionerDBに接続してalter tableを行おうして失敗していると思うので、
mariadb内の既存usersテーブルにlast_nameカラムが本当に無いか確認されたほうが良いかもです。
開発環境でDB初期化して問題ないのであれば以下コマンドを試してみてください。
$ php artisan migrate:fresh
@study_matome
Questionerエラーが解決いたしましたので、ご報告させていただきます。
phpMyadminというDB視覚化ツールで確認したところ、
既に新しいusersテーブルが作成されていたため、
重複していたとのことでした。
その後@TP2さんのコメントにあります、
以下のコマンドを実行し、ロールバック+マイグレーションを試みました。
$ php artisan migrate:fresh
その後、emailカラムが他のマイグレーションファイルで
indexによる制限がついており、文法エラーになりましたが
indexを外してからカラムの内容を変更したところ
無事にマイグレーションすることができました。
コメントを下さったお二方に感謝申し上げます。
ありがとうございました。