sql >> データベース >  >> RDS >> Mysql

Laravel 5.5ピボット結合により、MySQLのメイン結果を含むピボット値を取得します

    同様の状況で、クエリスコープ 1対多の関係のための私のピボットテーブルと一緒に。私の状況では、ユーザーには複数のグループがあり、追加のクエリやJOINを使用せずに、ユーザーオブジェクトとともにそれらのデータをフェッチする必要があります。Query scopeを参照してください。 1対多および多対多でLaravelDocをピボットします。

    ピボットテーブルを使用してデータをフェッチする場合は、
    ユーザーモデル:の例を次に示します。

    class User extends Authenticatable
    {
        use Notifiable;
    
    
        protected $fillable = [
            'name', 'email', 'username', 'password',
        ];
    
    
        protected $hidden = [
            'password', 'remember_token',
        ];
    
    
        public function groups()
        {
            return $this->belongsToMany('App\Group', 'user_groups', 
              'user_id', 'group_id');
        }
        public function scopeDetail($query)
        {
            return $query->with('groups');
        }
    }
    

    グループモデル:

    class Group extends Model
    {
        protected $fillable = [
            'dn', 'cn', 'description',
        ];
    }
    

    上記のユーザーモデルでは、return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id');を参照してください。 、ここで、user_groupsは、ユーザーとグループの関係を定義するピボットテーブルです。 group_id およびuser_id ピボットテーブルのフィールドです。

    上記のアーキテクチャを使用して(コントローラーで)データをフェッチするようになりました:

    User::where(.....)->detail()->first();
    

    ここで、detail() ユーザーモデルでscopeDetailとして定義されているスコープです 。注:scope プレフィックスを付ける必要があります。これにより、ユーザーが属するすべてのグループの配列がユーザーに提供されるため、JSONでデータを表示するときはいつでも、適切な方法で構造を確認できます。

    上記の方法を使用して、私のユーザー オブジェクトには、ユーザーが属するすべてのグループが含まれます。

    追加
    ユーザーモデル(users)が他のモデルにも関連している場合は、モデルクラスのスコープを次のように定義することでそれらすべてを含めることができます

    ............
    //..............
        public function profile()
        {
            return $this->belongsToMany('App\Profile', 'user_id');
        }
        public function data1()
        {
            return $this->belongsToMany('App\Data1', 'user_id');
        }
        public function groups()
        {
            return $this->belongsToMany('App\Group', 'user_groups', 
              'user_id', 'group_id');
        }
        //Defining query scope................
        public function scopeDetail($query)
        {
            return $query->with('groups','profile','data1');
            //to fetch user with this scope use User::where(.....)->detail()->get(); notice there is not scope prefix while using the scope
        }
    ........
    ........
    



    1. djangoの複合主キー

    2. mysqlは複数の列の配列です

    3. Djangoの非プライマリ外部キー

    4. クエリを選択し、条件に基づいてカウントします