質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

3532閲覧

Laravel 主キーが追加できない。

Shuuuuu

総合スコア16

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/04/25 09:19

編集2020/04/25 09:21

前提・実現したいこと

LaravelでDBを設計しています。
下記のようなDBを設計したいです。
Createテーブルとありますが、変更してPostsテーブルにしてあります。DB設計図

発生している問題・エラーメッセージ

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

使用できるタイプに下記のようにあります。

$table->increments('id'); 符号なしINTを使用した自動増分ID**(主キー)**

つまりincrementsを指定した時点でprimaryになるということです。
改めて指定する必要はありません。

投稿2020/04/25 09:24

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shuuuuu

2020/04/25 10:10

ありがとうございます。 これで次に進めそうです!
m.ts10806

2020/04/25 10:12

ヒントになったようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問