2017-05-17 4 views
0

Ich muss die aktiven Clients von einer Route mit Eloquent filtern.Laravel Eloquent, Filterung von Pivot-Tabelle Spalte

Ich arbeite mit einer Drittanbieter-Datenbank, die ich nicht ändern kann. In meinem Projekt habe ich zwei Modelle: Cliente (Client) und Ruta (Route), die eine viele zu viele Beziehung haben, so fügte ich die goesToMany Beziehung in meine Modelle.

Die einzige Spalte, die ich von der Pivot-Tabelle interessiert, heißt DESACTIV, die mir sagt, wenn ein Client für eine Route deaktiviert ist.

Ruta Modell:

class Ruta extends Model 
{ 
    protected $connection = 'mysql2'; 
    protected $table = 'truta'; 
    protected $primaryKey = 'CODIRUTA'; 

    public function clientes(){ 
     return $this->belongsToMany(Cliente::class, 'tcpcarut', 'CODIRUTA', 'CODICLIE')->withPivot('DESACTIV'); 
    } 
} 

Cliente Modell:

class Cliente extends Model 
{ 
    protected $connection = 'mysql2'; 
    protected $table = 'tcpca'; 
    protected $primaryKey = 'CODICLIE'; 

    public function rutas(){ 
     return $this->belongsToMany(Ruta::class, 'tcpcarut', 'CODICLIE', 'CODIRUTA')->withPivot('DESACTIV'); 
    } 
} 

Was ich brauche, ist es, die aktiv (oder nicht deaktiviert) Clients eine bestimmte Strecke gegeben zu bekommen.

ich getan habe es auf meinem Controller wie folgt aus:

$miRuta = Ruta::where('CODIRUTA','=',$ruta)->first(); 
$clientes = array(); 
foreach ($miRuta->clientes as $cliente){ 
    if ($cliente->DESACTIV == 0){ 
     array_push($clientes, $cliente->NOMBCLIE); 
     echo end($clientes)."<br/>"; 
    } 
} 

Und es funktioniert gut, aber ich glaube nicht, es elegant ist. Ich weiß, dass dies durch Eloquent erreicht werden kann, ich weiß es nur nicht zu wissen und weiß nicht, wie ich es tun soll.

  1. Vielleicht die Filter auf dem clientes Methode auf meinem Ruta Modell hinzufügen Ich konnte, so dass es nur die aktiven Clients zurückkehren würde.

  2. Oder vielleicht könnte es am besten, eine Methode auf dem Cliente Modell zu schreiben, isDeactivated

Ich weiß, es klingt wie ich weiß, wovon ich rede, aber ich brauche jemanden, Um meine Hand darauf zu halten, bin ich einfach zu Noob mit Eloquent: /. Beispiele würden sehr geschätzt werden.

Antwort

1

Sie können die wherePivot-Methode verwenden, um eine Beziehung basierend auf Werten in der Pivot-Tabelle zu beschränken. Sie müssen nur Folgendes zu Ihrem Ruta Modell

public function desactivClientes() { 
    return $this->clientes()->wherePivot('DESACTIV', 0); 
} 

hinzuzufügen Und dann muss man nur ein bisschen den Rest des Codes modifizieren, um die eingeschränkte Beziehung zu verwenden. Ich füge auch eine NULL-Prüfung hinzu, wenn diese Funktion null zurückgibt, was passieren kann, wenn Ihre Tabelle keinen Datensatz enthält, in dem CODIRUTA übereinstimmt, was in $ruta ist, wird es wahrscheinlich einen schwerwiegenden Fehler auslösen, der versucht, eine Methode aufzurufen ein Nicht-Objekt.

+0

Ich habe noch nie von wherePivot gehört, das passiert, wenn Sie ein Projekt starten, ohne sich die Zeit zu nehmen, um zu wissen, mit was Sie arbeiten. Wie Sie gesehen haben, implementierte ich die schnellste Lösung meines Wissens, um mit dem Projekt weiter voranzukommen. Danke, mein Code ist auf diese Weise viel sauberer: D. – Adocad