ホーム>source

Laravelでの多対多の関係を支援する人もいます。

ロールとユーザーの例を使用する-基本的に:

  • すべての役割の表
  • ユーザーのためのテーブル
  • そしてuser_idとrole_idを持つテーブル。

3番目のテーブル、たとえばYearに追加します。基本的に、ピボットテーブルにはuser_id、role_id、year_idがあります。

たとえば、特定の年に特定のロールを割り当てられたすべてのユーザーをプルするクエリを作成できるようにしたいと思います。たとえば、role_id = 2、year_id = 1のすべてのユーザー。

どんな助けでもありがたいです

あなたの答え
  • 解決した方法 # 1

    答える前に、このようなデータベースに年を置かないことをお勧めします。 すべてのテーブルに created_at が必要です  そして updated_at  これで十分でしょう。

    必要に応じてユーザーをフィルタリングします。あなたはこれを行うことができます:

    ウィズウィズ
    

    この例は、あなたが探している正確なクエリではないかもしれませんが、それを思いつくには十分なはずです。

  • 解決した方法 # 2

    Eloquentとの3方向の関係を実現する最良の方法は、この関係を表すテーブルのモデルを作成することです。ピボットテーブルは、双方向のリレーションで使用するためのものです。

    次に、 // This queries all users that were assigned to 'admin' role within 2013. User::join('role_users', 'role_users.user_id', '=', 'users.id') ->join('roles', 'roles.id', '=', 'role_users.role_id') ->where('roles.name', '=', 'admin') ->where(DB::raw('YEAR(role_users.created_at)', '=', '2013') ->get(); というテーブルを作成します。  タイムスタンプなどのこの3ウェイ関係に関連するデータを持つことができます...

  • 解決した方法 # 3

    非常に古い質問に対する非常に遅い回答ですが、Laravelは、少なくともLaravel 6.xを通じて変更されていないドキュメントから、少なくともLaravel 5.1の追加の中間(ピボット)テーブル列をサポートしています。

    多対多の関係を定義するときに、これらの追加の列を説明できます。

    ウィズウィズ
    

    またはあなたのケースでは、以下も仕事をします:

    ウィズウィズ
    

    これは roles_users_year 経由でアクセスできます  モデルの属性:

    ウィズウィズ
    

    ピボット属性は遠い関係にあることに注意してくださいモデル (単一の return $this->belongsToMany(Role::class)->withPivot('column1', 'column2'); )関係自体ではありません。

    すべての return $this->belongsToMany(Role::class)->withTimestamps(); を取得するには pivot に割り当てられたs s任意の年に、特別な関係を作成できます。

    ウィズウィズ
    
    $user = User::find(1); foreach ($user->roles as $role) { echo $role->pivot->created_at; }

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ css - @mediaで私のdivの高さが変更されないのはなぜですか?