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

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

ただいまの
回答率

88.23%

【laravel8+jetstream】Userテーブルと別テーブルの多対多のリレーションが出来ない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 308

pup-ganbaru

score 25

ログイン認証機能を実装しました。そこで新たにSitesテーブルというのを作り、多対多のリレーションを結ぼうとしたのですが、中々うまくいきません。
多対多のリレーションについては何度も実装したことがあります。
自動生成されたUsersテーブルと私が作ったSitesテーブルを紐づけるといった場合特別な記述が必要だったりするのでしょうか?
必要な情報が足りてない場合すぐに追記致します

User.php 

    public function sites()
    {
        return $this->belongsToMany('App\Models\Site');
    }

Site.php

    public function users()
    {
        return $this->belongsToMany('App\Models\User');
    }

テーブル構成
Sites テーブル
id             bigint unsigned 連番    
site_name    varchar(255)    

Usersテーブル
id    bigint unsigned 連番    
name    varchar(255)

中間テーブル
id    bigint unsigned 連番    
site_id    bigint unsigned    
user_id    bigint unsigned    

結果
user_id 23は存在します。

User::find(23)->sites
=> Illuminate\Database\Eloquent\Collection {#4388
all: [],
}

試したこと

変更前のコード
    // public function store(
    //     Request $request,
    //     CreatesNewUsers $creator
    // ): RegisterResponse {
    //     event(new Registered($user = $creator->create($request->all())));
    //     return app(RegisterResponse::class);
    // }


自分のコード
   public function store(Request $request)
    {
        $user = new User;
        $user->name = $request->name;
        $user->store_code = $request->store_code;
        $user->staff_name = $request->staff_name;
        $user->max_cast = $request->max_cast;
        $user->email = $request->email;
        $user->password = $request->password;
        $user->save();
        $user->sites()->attach($request->site_id);
        return redirect()->route('store.index');
    }

マイグレーションファイル

site_user_table.php

     */
    public function up()
    {
        Schema::create('site_user', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

add column site_user table php

    */
    public function up()
    {
        Schema::table('site_user', function (Blueprint $table) {
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('site_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('site_id')->references('id')->on('sites')->onDelete('cascade');
        });
    }

user table php

   public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->foreignId('current_team_id')->nullable();
            $table->text('profile_photo_path')->nullable();
            $table->timestamps();
        });
    }

site table php

   public function up()
    {
        Schema::create('sites', function (Blueprint $table) {
            $table->id();
            $table->string('site_name');
            $table->string('site_url');
            $table->boolean('delete_flg');
            $table->softDeletes();
            $table->timestamps();
        });
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kai0310

    2020/10/29 20:04

    マイグレーションファイルを提示して下さい。

    キャンセル

  • pup-ganbaru

    2020/10/30 11:28

    追記しました。よろしくお願いいたします

    キャンセル

回答 2

0

$ composer dump-autoload


ビルトインサーバーなら一度起動し直してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/29 19:19

    それでもダメでした。中間テーブルにIDが入ってくれないですね。
    $user->sites()->attach($request->site_id);
    この記述で再現できるはずなのですが、やはりstoreメソッドの中身を大きく変えてるのがよくないんですかね・・・

    キャンセル

  • 2020/10/29 21:02 編集

    確認する手順


    php artisan tinkerで
    App\Models\User::find(1)->sites()->attach(1)
    のように直書きしてみる。


    public function store
    の$user->save()の直後に
    dd($user)
    で確認

    キャンセル

  • 2020/10/30 11:37

    どちらもsite_idを取得することができませんでした・・・

    キャンセル

check解決した方法

-1

リレーションは出来てました・・・純粋にIDがstoreにrequestで送れていないことが原因でした。
当然IDが取得出来ていないのに保存できるわけもなく・・・
お騒がせしました。回答をくださった皆様ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る