日別アーカイブ: 2016年5月19日

LaravelのEloquentで悩む

前回から、モデルを定義して、モデルと密接に関係しているデータベースとの関わり合いをうまいところやってくれるらしいEloquent ORMというものをいろいろ探って試行錯誤してみていたけど、よくわかっていない。とりあえずやったことを書き残す。

前回、troubleというモデルをartisanコマンドでひな形を作ったところで終わった。で、私の設計上、このtroubleというモデルは、自らに対して1対nの関連性を持つような想定だ。親のtroubleに、複数のtroubleがぶらさがる、ツリー構造のようなイメージだ。

で、troubleがもつカラムとしては、長文のテキスト「document」の1つのみとした。

まずは前回atrisanコマンドで作ってもらったマイグレーション用のファイルdatabase/migrations/~create_troubles.php をいろいろなドキュメントを見よう見まねで修正した。因みにupメソッドが作成するとき、downメソッドが元に戻すときのことを書くらしい。

この5行目でdocumentカラムの定義だが、6行目では、自分の親のidを納めるtrouble_idカラムを定義している。そして、9行目で、外部キー束縛を定義している。これでマイグレーションをし直す。

> php artisan migrate:refresh

すると、MySQLのデータベースを見ると、テーブルに「document」と「trouble_id」のカラムが追加されている。よしよし。

そして、今度は、App\Trouble.phpを以下のように修正した。

ここでテーブル間の相関関係を定義するらしい。便宜上ツリーに見立てて1を親、nを子として説明するが、hasManyが、子クラス(App\Trouble)と親のApp\Trouble間には、子のtrouble_idに親のidをもつ形で複数の関係あるよ、ということになって、belongsToは、その逆、子から1つの親があるよ、ということになるらしい。

さらに、Seederっていって、データベースの初期状態を定義できる仕組みを使って、操作方法を確かめてみる。databases\seeda\DatabaseSeeder.phpを以下のように修正した。

で、artisanにてseedを実行!

> php artisan db:seed

そしてt_troubleテーブルを見ると、「ぶらさがります」と「こっちもぶらさがり」のtrouble_idに、「こんにちは世界」のidが入っているのがわかる。うまくいっているようですねー。

親を先にsaveでDBに格納しておかないと、親のIDがわからないので、当然うまくいかないようだ。そしてtrb1のtroublesで関連づけたくてtrb2を書き込むときは、「$trb1->troubles()->save($trb2)」って書くところがなかなか思いつかないのねー。

この状態で、

とやると、idが1のレコードにぶら下がるレコード群をdata変数へ得ることができるようです。

今日はここまで…