Mysql
 sql >> Database >  >> RDS >> Mysql

Laravel 5.5 pivot join per ottenere valori pivot con il risultato principale di MySQL

Ho avuto una situazione simile e ho Ambito della query insieme alla mia tabella pivot per una relazione uno a molti. Nella mia situazione, l'utente ha più gruppi e ho bisogno di recuperare quei dati insieme all'oggetto utente senza query aggiuntive o senza JOIN.Vedi Query scope e uno a molti e molti a molti con perno su Laravel Doc.

Se desideri recuperare i dati utilizzando la tabella pivot, ecco l'esempio
Modello utente:

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

Modello di gruppo:

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

Nel modello utente sopra, vedi return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id'); , dove user_groups è la mia tabella pivot che definisce la relazione tra utenti e gruppo. group_id e user_id sono i campi nella tabella pivot.

Ora Recupero dei dati (sul controller) utilizzando l'architettura sopra:

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

dove detail() è il mio ambito definito in Modello utente come scopeDetail . Nota:scope il prefisso deve essere allegato. Questo ti darà l'utente con tutti i gruppi a cui appartiene l'utente nell'array, quindi ogni volta che visualizzi i tuoi dati in JSON puoi vedere la struttura nel modo corretto.

Utilizzando il metodo sopra, il mio utente l'oggetto ha tutti i gruppi a cui appartiene l'utente.

Extra
Se il tuo modello utente (utenti) è correlato anche ad altri modelli, puoi includerli tutti definendo l'ambito sulla classe del modello come

............
//..............
    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
    }
........
........