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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

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

Q&A

解決済

3回答

1089閲覧

Laravel リレーション定義ができない

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

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

0グッド

0クリップ

投稿2020/09/13 09:16

編集2020/09/14 14:59

前提・実現したいこと

Laravelで図書館で借りた本をユーザが確認できる様なものを作成しています。
その際にユーザの情報を保存するusersテーブルと本の一覧を保存するbooksテーブルがあり、それらの借りた履歴を保存する中間テーブルのbook_userテーブルがあるのですが、この時どの様にbook_userテーブルにデータを入れるのでしょうか?
【Laravel】多対多の中間テーブルのモデルはPivot化するとアクセスしやすくなりメソッドを使いやすい
の記事を見たところ中間テーブルのModelは不要だと以下の様に書いていましたが、その場合どの様にすれば良いのかがわかりませんので分かる方に教えていただきたいです。????

また同様に借りた履歴をDBにデータを挿入したいときどのModelを指定すれば良いのでしょうか?

そもそもリレーションの部分が間違っている可能性もあるかと思うのでそちらも確認していただきたいです。。何卒よろしくお願いします。

中間テーブルのモデルにメソッドを持たせていて、それを使いたい場合に便利です。

該当のソースコード

create_users_table.php (特に変えていません!)

PHP

1 $table->id(); 2 $table->string('name'); 3 $table->string('email')->unique(); 4 $table->timestamp('email_verified_at')->nullable(); 5 $table->string('password'); 6 $table->rememberToken(); 7 $table->timestamps();

create_books_table.php

PHP

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreateBooksTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('books', function (Blueprint $table) { 17 $table->id(); 18 $table->char('book_name'); 19 $table->bigInteger('book_price'); 20 $table->text('book_detail'); 21 $table->timestamps(); 22 }); 23 } 24 25 /** 26 * Reverse the migrations. 27 * 28 * @return void 29 */ 30 public function down() 31 { 32 Schema::dropIfExists('books'); 33 } 34} 35

create_book_user_table.php

PHP

1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreateBookUserTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('book_user', function (Blueprint $table) { 17 $table->id(); 18 $table->unsignedBigInteger('user_id'); 19 $table->unsignedBigInteger('book_id'); 20 $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 21 $table->foreign('book_id')->references('id')->on('books')->onDelete('cascade'); 22 $table->timestamps(); 23 }); 24 } 25 26 /** 27 * Reverse the migrations. 28 * 29 * @return void 30 */ 31 public function down() 32 { 33 Schema::dropIfExists('book_user'); 34 } 35} 36

App\User.php (追加した部分)

PHP

1 public function books(){ 2 return $this->belongsToMany("App\Book"); 3 }

App\Book.php

PHP

1 <?php 2 3 namespace App; 4 5 use Illuminate\Database\Eloquent\Model; 6 7 class Book extends Model 8 { 9 protected $table = "books"; 10 11 protected $fillable = [ 12 'book_name', 'book_price', 'book_detail', 13 ]; 14 15 public funciton users(){ 16 return $this->belongsToMany("App\User"); 17 } 18 } 19

試したこと

上記コードで試してみました

補足情報(FW/ツールのバージョンなど)

Laravel 7.28.1

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/09/15 11:27

ありがとうございます。 そちらに関しても一度目を通しました!しかし、データが既に入っている前提での解説の様なものしか記載しておらず、実際にControllerからModelを指定してデータを挿入する際の方法が分からなかったので質問させていただいた次第です。
guest

回答3

0

ベストアンサー

https://readouble.com/laravel/7.x/ja/eloquent-relationships.html#many-to-many

こちらのページの「中間テーブルへの追加データ保存」に書かれています。

イメージ説明

イメージ説明

投稿2020/09/16 00:26

編集2020/09/16 06:44
phper.k

総合スコア3923

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

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

退会済みユーザー

退会済みユーザー

2020/09/16 06:23

ありがとうございます。 Modelがない場合は毎度DB::table()を書いて取得する必要があるということでしょうか?
phper.k

2020/09/16 06:26 編集

App\Book.php はモデルでしょうよ 自分でモデル作ってるのに何でModel はないと?
退会済みユーザー

退会済みユーザー

2020/09/16 06:28

勘違いしてました! 中間テーブルのModelはないという意味でその様に言った次第です。 1つのテーブルに1つのModelかと思ってたのですがそれは違う様ですね、、
phper.k

2020/09/16 06:39

「中間テーブルへの追加データ保存」この項目ちゃんと読んでいます?
退会済みユーザー

退会済みユーザー

2020/09/16 06:53

save〜の部分を見ていました。 ありがとうございます。
guest

0

PHP

1User::find(1)->books()->attach(2);

このコードを用いると
user_idが1
book_idが2
という行が、book_userテーブルに挿入されます。

もしも、本当に保存されているのか気になる場合は、
1, phpMyAdminから確認, CUIで確認
2, User::find(1)->groupsで取得できるか確認
のいずれかでできます。

投稿2020/09/16 02:37

編集2020/09/16 02:39
kyoya0819

総合スコア10429

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

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

退会済みユーザー

退会済みユーザー

2020/09/16 06:23

attachとsyncとsaveの違いがいまいち分からなかったので使い分けをどの様にするか教えていただけないでしょうか?
kyoya0819

2020/09/16 07:58 編集

普通に間違えです。修正します。
guest

0

Eloquentにそれ用のメソッドが用意されています。
attach detach sync辺りで検索をすると解説のページを発見できるかと思います。

投稿2020/09/13 15:32

shu2ro

総合スコア9

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

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

退会済みユーザー

退会済みユーザー

2020/09/14 14:57

すいません。 質問点と異なる回答なのですが、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問