Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Laravel 5.5 Pivot Join, um Pivot-Werte mit dem Haupt-MySQL-Ergebnis zu erhalten

Ich hatte eine ähnliche Situation und ich habe Scope Query zusammen mit meiner Pivot-Tabelle für eine zu vielen Beziehung. In meiner Situation hat der Benutzer mehrere Gruppen und ich muss diese Daten zusammen mit dem Benutzerobjekt ohne zusätzliche Abfrage oder ohne JOINs abrufen. Siehe Query scope und eins zu vielen und viele zu vielen mit Pivot auf Laravel Doc.

Wenn Sie Daten mithilfe einer Pivot-Tabelle abrufen möchten, finden Sie hier das Beispiel
Benutzermodell:

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

Gruppenmodell:

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

Siehe im obigen Benutzermodell return $this->belongsToMany('App\Group','user_groups', 'user_id', 'group_id'); , wobei user_groups meine Pivot-Tabelle ist, die die Beziehung zwischen Benutzern und Gruppe definiert. group_id und user_id sind die Felder in der Pivot-Tabelle.

Jetzt werden Daten (auf dem Controller) mit der obigen Architektur abgerufen:

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

wobei detail() ist mein Bereich, der im Benutzermodell als scopeDetail definiert ist . Hinweis:scope Präfix muss angehängt werden. Dadurch erhalten Sie den Benutzer mit allen Gruppen, denen der Benutzer im Array angehört, sodass Sie die Struktur immer dann richtig sehen können, wenn Sie Ihre Daten in JSON anzeigen.

Mit obiger Methode, mein Benutzer Objekt enthält alle Gruppen, denen der Benutzer angehört.

Extra
Wenn sich Ihr Benutzermodell (Benutzer) auch auf andere Modelle bezieht, können Sie all diese einbeziehen, indem Sie den Bereich für die Modellklasse als

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