LoginSignup
28
27

More than 5 years have passed since last update.

Laravel初心者がLaravelのデータベース操作をやってみてすごく面倒だと気付いた

Last updated at Posted at 2017-06-27

主キーに関して

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作業中なので、追記するかもしれません。

何か間違いや、他に良い方法がありましたら教えて下さると助かります。

28
27
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
27