Laravel5.4でEloquentの中間テーブルを使ってみる

久しぶりにLaravelを使っています。
更新が途絶えていた間に、Laravel5.4が出ている…ということで、昔CakePHPで作ったサイトをLaravel5.4でリプレイスしています。
環境的にはこんな感じです↓
PHP:7
PHPFW:Laravel5.4
DB:MySQL
CSSFW:Materialize

さて、タイトルにしましたEloquentについてです。
以前にも使ってみてはいましたが、今回リプレイスということで…DBの構造は変えずにそれ以外を変えることにしました。(データ移行とかめんどくさいから
それでCake時代に作ったテーブル達なので、Laravelがいい感じにやってくれるあれこれがうまく働かないという自体に陥りました。。

中間テーブルのある構造

今回やりたかったことは、、本に紐付いているタグの情報も引っくるめて情報を取得する、ということでした。
下記の3テーブルのリレーションですね。よくある形かと思います。

  • book(書籍情報テーブル)
  • tag_mapping(中間テーブル)
  • tag(タグテーブル)

公式ドキュメントで言うところの多対多、belongsToManyを使いたい!!と思ったのですが…
(このドキュメントではuser、roleというデータを例にしていますが、本とタグの場合も同様ですよね)
ここに書いてある通りにしようとすると、、

前に述べたようにリレーションの結合テーブルの名前を決めるため、Eloquentは2つのモデル名をアルファベット順に結合します。

テーブル名からしてもう合わないんですよねwここで一度全部作り直そうかと思ったのですが、一応このままでもできる!ということで試してみることにしました。
ちなみに下記のようなテーブル名であれば楽だったと思われます。

  • books(書籍情報テーブル)
  • book_tag(中間テーブル)
  • tags(タグテーブル)

オーバーライドしてbelongsToManyを使う

Eloquentがいい感じに解釈して複数テーブルから欲しいデータを取得してくれる!ということはないので、いい感じに解釈できるようModelをオーバーライドしてしまいます。記憶を改ざんしちゃう感じです。

book(Book.php:書籍情報テーブル)

tag_mapping(TagMapping.php:中間テーブル)

tag(Tag.php:タグテーブル)

これで準備は完了です!
あとは、取得した書籍情報にtagsというタグの情報が加わっています!

結合テーブル名のカスタマイズに加えテーブルのキーカラム名をカスタマイズするには、belongsToManyメソッドに追加の引数を渡してください。第3引数はリレーションを定義しているモデルの外部キー名で、一方の第4引数には結合するモデルの外部キー名を渡します。

ということで

と書いているのですが、ややこしいですよね。

ここまで書いておいてなんですが、やはりLaravelの望む形でテーブル定義をしてあげるのが一番だと思います…w
めんどくさがらずに…

スポンサーリンク
レクタングル(大)
レクタングル(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする