主キーに関して
Eloquentは更にテーブルの主キーがidというカラム名であると想定しています。この規約をオーバーライドする場合はprimaryKeyプロパティを定義してください。
さらに、Eloquentは主キーを自動増分される整数値であるとも想定しています。つまり、デフォルト状態で主キーは自動的にintへキャストされます。自動増分ではない、もしくは整数値ではない主キーを使う場合、モデルにpublicの$incrementingプロパティーを用意し、falseをセットしてください。
Laravel 5.4 ドキュメント
Model生成時の指定
なので、Modelファイルを
# php artisan make:model Book
のように作成し、controller等で
use App\Book;
$books = new Book;
$books->book_id = '0001';
$books->book_name = 'カエルは何処からやってくる'
$books->save();
とか書いてしまうと、View上で
「id」カラムに挿入しようとしたけどテーブルにidが存在しないよ
とエラーになる。
初心者のこっちからしたら そもそも「id」に値を挿入しようなんかしてないんだが
という感じでしかない。
主キーを指定してあげる
エラーになる理由としては、「主キーに関して」に書かれている通りなので、主キーを指定してあげる必要がある。
Modelファイルにて
class Book extends Model
{
protected $primaryKey = 'book_id';
}
また、「主キーに関して」に書かれている通り
自動増分ではない、もしくは整数値ではない主キーを使う場合
以下を追加します。
public $incrementing = false;
これでエラーがなくなります。
Maigrationでテーブルを作成時の指定
$table->primary('book_id');
でbook_id
を主キー
に指定できるのは分かったけども、
「あれ、型の指定は何処からするの?」
と思い調べるけども中々記述の仕方が見つからない(;´Д`)
テーブル名を指定してあげる
まあ、結論として
$table->string('book_id',2)->primary();
ごく単純にこれで通りました、はい。
(試しに$table->primary('book_id');
をphp artisan migrate
実行したらキーとして指名された列"book_id"は存在しません
と吐かれたので試し上記の書き方をしてみたら上手くいきました)
Migrationの記述の仕方で詳しく書かれていた記事がありましたので載せておきます。
Laravel5 マイグレーションの操作
(おまけ) Migration操作を取り消したい
実行したマイグレーションを取り消したい場合
php artisan migrate:rollback
で取り消せますが、これは最後に実行されたマイグレーション操作のみを取り消す
ので、2つ前に実行したマイグレーション操作のみを取り消したりすることはできません。
参考URL:Laravel 5.4 データベース:マイグレーション
なので、この場合1度マイグレーションファイルを新規で作ってup()
内でしたい操作を記述して実行するのがbestかと思います。
勝手にテーブル名を複数形にされる
Flightモデルにどのテーブルを使用するか、Eloquentに指定していない点に注目してください。他の名前を明示的に指定しない限り、クラス名を複数形の「スネークケース」にしたものが、テーブル名として使用されます。今回の例で、EloquentはFlightモデルをflightsテーブルに保存します。モデルのtableプロパティを定義し、カスタムテーブル名を指定することもできます。
Laravel 5.4 Eloquent:利用の開始
例えばperson
というテーブルがあったとします。
personテーブルにデータを挿入しようとすると
use App\Person;
$table = new Person;
$table->test_id = '0001';
$table->save();
LaravelはModelのClass名に対して複数系の名前
でDBにTableを探しに行くので、上記の場合people
でTableを探しに行って「そんなTableないよ」
とエラーになります。
(おまけ)複数形且つ、スネークケース
テーブル名を明示的に指定する方法は後述しますが、
明示的に指定しない場合、複数形スネークケースで探しにいくことになります。
例)
テーブル名 -> test_records (複数形、スネークケース)
モデル名 -> TestRecord (単数形、アッパーキャメルケース)
参考URL
Eloquent: Getting Started #Defining Models
テーブル名を指定してあげる
解決策としてModelファイルであるPerson.phpにテーブル名を指定してあげます。
class Person extends Model
{
protected $table = 'person';
}
現在Laravel作業中なので、追記するかもしれません。
何か間違いや、他に良い方法がありましたら教えて下さると助かります。