sql >> Databasteknik >  >> RDS >> Mysql

Laravel 5.5 pivot join för att få pivotvärden med huvud MySQL-resultat

Jag hade liknande situation och jag Frågeomfattning tillsammans med min pivottabell för en till många relation. I min situation har användaren flera grupper och jag måste hämta dessa data tillsammans med användarobjektet utan extra fråga eller utan JOINs. Se Query scope och en till många och många till många med pivot på Laravel Doc.

Om du vill hämta data med hjälp av pivottabell, här är exemplet
Användarmodell:

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');
    }
}

Gruppmodell:

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

I ovanstående användarmodell, se return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id'); , där user_groups är min pivottabell som definierar relationen mellan användare och grupp. group_id och user_id är fälten i pivottabellen.

Hämtar nu data (på styrenheten) med ovanstående arkitektur:

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

där detail() är mitt omfång definierat i användarmodellen som scopeDetail . Obs:scope prefix måste bifogas. Detta ger dig användaren med alla grupper som användaren tillhör i array, så när du tittar på din data i JSON kan du se strukturen på rätt sätt.

Med ovanstående metod, min användare objektet har alla grupper som användaren tillhör.

Extra
Om din användarmodell(användare) är relaterad till andra modeller också kan du inkludera alla dessa genom att definiera omfattningen på modellklassen som

............
//..............
    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. Mysql - Byt namn på alla tabeller och kolumner till gemener?

  2. MySQL (Windows10) FULLTEXT-sökning med MyISAM-tabeller fungerar inte

  3. MySQL lägger till join saktar ner hela frågan

  4. Capistrano:Hur distribuerar man MySQL-databas för en PHP-applikation?