sql >> Databáze >  >> RDS >> Mysql

Laravel 5.5 pivot join pro získání pivotních hodnot s hlavním výsledkem MySQL

Měl jsem podobnou situaci a Rozsah dotazu spolu s mou kontingenční tabulkou pro jeden až mnoho vztahů. V mé situaci má uživatel více skupin a potřebuji tato data načíst spolu s objektem uživatele bez dalšího dotazu nebo bez JOINů. Viz Query scope a jeden k mnoha a mnoho k mnoha s pivotem na Laravel Doc.

Pokud chcete načíst data pomocí kontingenční tabulky, zde je příklad
Uživatelského modelu:

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

Skupinový model:

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

Ve výše uvedeném uživatelském modelu viz return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id'); , kde user_groups je moje kontingenční tabulka, která definuje vztah mezi uživateli a skupinou. group_id a user_id jsou pole v kontingenční tabulce.

Nyní načítání dat (na řadiči) pomocí výše uvedené architektury:

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

kde detail() je můj rozsah definovaný v uživatelském modelu jako scopeDetail . Poznámka:scope musí být připojena předpona. To vám poskytne uživatele se všemi skupinami, do kterých uživatel patří v poli, takže kdykoli si prohlížíte svá data v JSON, můžete vidět strukturu správným způsobem.

Pomocí výše uvedené metody můj uživatel objekt má všechny skupiny, do kterých uživatel patří.

Navíc
Pokud váš uživatelský model (uživatelé) souvisí také s jinými modely, můžete je všechny zahrnout definováním rozsahu pro třídu modelu jako

............
//..............
    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. Běžné chyby při migraci databází PostgreSQL z On-Prem na AWS RDS

  2. Spouštění úloh údržby databáze SQL pomocí SQLCMD

  3. Řetězec k časovému razítku v MySQL

  4. UPDATE s ORDER BY a LIMIT nefungující v MYSQL