前提・実現したいこと
LaravelでDBを設計しています。
下記のようなDBを設計したいです。
Createテーブルとありますが、変更してPostsテーブルにしてあります。
発生している問題・エラーメッセージ
php artisan migrateを実行すると下記のエラーが出ます。
一つのテーブルに複数のprimary keyは許されていないと出ています。
SQLSTATE[42P16]: Invalid table definition: 7 ERROR: multiple primary keys for table "categories" are not allowed (SQL: alter table "categories" add primary key ("category_id"))
該当のソースコード
usersテーブル
1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreateUsersTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('users', function (Blueprint $table) { 17 $table->id()->primary(); 18 $table->string('name'); 19 $table->string('email')->unique(); 20 $table->timestamp('email_verified_at')->nullable(); 21 $table->string('password'); 22 $table->rememberToken(); 23 $table->timestamps(); 24 }); 25 } 26 27 /** 28 * Reverse the migrations. 29 * 30 * @return void 31 */ 32 public function down() 33 { 34 Schema::dropIfExists('users'); 35 } 36} 37
postsテーブル
1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreatePostsTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('posts', function (Blueprint $table) { 17 $table->increments('id'); 18 $table->integer('userid'); 19 $table->string('filename', 255); 20 $table->integer('category_id'); 21 $table->text('explanation'); 22 $table->timestamps(); 23 24 //外部キーの設定 25 $table->foreign('user_id')->references('id')->on('users'); 26 $table->foreign('category_id')->references('category_id')->on('categories'); 27 }); 28 } 29 30 /** 31 * Reverse the migrations. 32 * 33 * @return void 34 */ 35 public function down() 36 { 37 Schema::dropIfExists('posts'); 38 } 39} 40
categoryテーブル
1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreateCategoriesTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('categories', function (Blueprint $table) { 17 $table->increments('category_id'); 18 $table->string('filename', 255); 19 $table->timestamps(); 20 21 // 主キーの追加 22 $table->primary('category_id'); 23 }); 24 } 25 26 /** 27 * Reverse the migrations. 28 * 29 * @return void 30 */ 31 public function down() 32 { 33 Schema::dropIfExists('categories'); 34 } 35} 36
試したこと
①categoriesテーブルのcategory_idのカラムタイプをincrementsにしていました。そのカラムタイプがすでにprimary属性をもっているのではと思い、usersテーブルのidカラムと同様に変えました($table->id()->primary();)。それでも、結局うまく行かなかったのでもとに戻しました。
②最初categoriesテーブルのカラムをidという名前にしており、userテーブルとかぶっているのは良くないとのことなのでcategoriesテーブルのidカラムをcategory_idに変えました。その後、php artisan migrate行うと下記のエラーが出ました。
Migrating: 2020_04_19_125129_create_categories_table BadMethodCallException Method Illuminate\Database\Schema\Blueprint::category_id does not exist. at vendor/laravel/framework/src/Illuminate/Support/Traits/Macroable.php:103 99| */ 100| public function __call($method, $parameters) 101| { 102| if (! static::hasMacro($method)) { > 103| throw new BadMethodCallException(sprintf( 104| 'Method %s::%s does not exist.', static::class, $method 105| )); 106| } 107| • Bad Method Call: Did you mean Illuminate\Database\Schema\Blueprint::temporary() ? 1 database/migrations/2020_04_19_125129_create_categories_table.php:17 Illuminate\Database\Schema\Blueprint::__call("category_id", []) +4 vendor frames 6 database/migrations/2020_04_19_125129_create_categories_table.php:20 Illuminate\Support\Facades\Facade::__callStatic("create")
③categoryテーブルの書き方に問題があると思い、ソースコードに載せてあるように書きました
→$table->increments('category_id')->primary();(過去)
→$table->increments('category_id');(現在。一行でまとめることをやめました。)
$table->primary('category_id');
最後に
説明不足な点やわかりにくい点がありましたら追記します。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
他に必要な情報がありましたら乗せるので教えて下さい。
Macbook Pro 13
Laravel Installer 1.5.0
Laravel Framework 7.3.0
PostgreSQL
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/25 10:10
2020/04/25 10:12