Laravel リレーション定義ができない
- 評価
- クリップ 0
- VIEW 370

退会済みユーザー
前提・実現したいこと
Laravelで図書館で借りた本をユーザが確認できる様なものを作成しています。
その際にユーザの情報を保存するusersテーブル
と本の一覧を保存するbooksテーブル
があり、それらの借りた履歴を保存する中間テーブルのbook_userテーブル
があるのですが、この時どの様にbook_userテーブル
にデータを入れるのでしょうか?
【Laravel】多対多の中間テーブルのモデルはPivot化するとアクセスしやすくなりメソッドを使いやすい
の記事を見たところ中間テーブルのModelは不要だと以下の様に書いていましたが、その場合どの様にすれば良いのかがわかりませんので分かる方に教えていただきたいです。🙏
また同様に借りた履歴をDBにデータを挿入したいときどのModelを指定すれば良いのでしょうか?
そもそもリレーションの部分が間違っている可能性もあるかと思うのでそちらも確認していただきたいです。。何卒よろしくお願いします。
中間テーブルのモデルにメソッドを持たせていて、それを使いたい場合に便利です。
該当のソースコード
create_users_table.php (特に変えていません!)
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
create_books_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBooksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->id();
$table->char('book_name');
$table->bigInteger('book_price');
$table->text('book_detail');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('books');
}
}
create_book_user_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateBookUserTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('book_user', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('book_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('book_user');
}
}
App\User.php (追加した部分)
public function books(){
return $this->belongsToMany("App\Book");
}
App\Book.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Book extends Model
{
protected $table = "books";
protected $fillable = [
'book_name', 'book_price', 'book_detail',
];
public funciton users(){
return $this->belongsToMany("App\User");
}
}
試したこと
上記コードで試してみました
補足情報(FW/ツールのバージョンなど)
Laravel 7.28.1
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
https://readouble.com/laravel/7.x/ja/eloquent-relationships.html#many-to-many
こちらのページの「中間テーブルへの追加データ保存」に書かれています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
User::find(1)->books()->attach(2);
このコードを用いると
user_idが1
book_idが2
という行が、book_userテーブルに挿入されます。
もしも、本当に保存されているのか気になる場合は、
1, phpMyAdminから確認, CUIで確認
2, User::find(1)->groups
で取得できるか確認
のいずれかでできます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-3
Eloquentにそれ用のメソッドが用意されています。
attach detach sync辺りで検索をすると解説のページを発見できるかと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
phper.k
2020/09/15 09:34
https://readouble.com/laravel/7.x/ja/eloquent-relationships.html#many-to-many
こちらは既に読んでますでしょうか?
退会済みユーザー
2020/09/15 20:27
ありがとうございます。
そちらに関しても一度目を通しました!しかし、データが既に入っている前提での解説の様なものしか記載しておらず、実際にControllerからModelを指定してデータを挿入する際の方法が分からなかったので質問させていただいた次第です。