2017-05-24 7 views
0

ich in meinem Modell Code eine BeziehungLaravel - wieVisible ein Attribut in einer Laravel-Beziehung machen?

class User extends Authenticatable 
{ 
... 
    public function extensions() 
    { 
     return $this->belongsToMany(Extension::class, 'v_extension_users', 'user_uuid', 'extension_uuid'); 
    } 
... 
} 

Das Erweiterung hat Feld Passwort versteckt zu bekommen.

class Extension extends Model 
{ 
... 
    protected $hidden = [ 
     'password', 
    ]; 
... 
} 

Unter Umständen möchte ich makevisible das Passwort-Feld.

Wie kann ich das erreichen?

Antwort

0

Nun, ich habe die Idee von https://stackoverflow.com/a/38297876/518704

Da mein Beziehungsmodell Extension::class namentlich in meinem Code return $this->belongsToMany(Extension::class,... aufgerufen wird, kann ich nicht einmal Parameter an seinen Konstruktor übergeben.

Um etwas an den Konstruktor zu übergeben, kann ich statische Klassenvariablen verwenden.

Also in meinem Extension Modell ich statische Variablen hinzufügen und makeVisible Methode ausführen. Später zerstöre ich die Variablen, um sicherzustellen, dass die nächsten Aufrufe und Instanzen die Standardmodelleinstellungen verwenden.

Ich bewegte dies zu einem Merkmal, aber hier zeige ich an meinem Modellbeispiel.

class Extension extends Model 
{ 
    public static $staticMakeVisible; 

    public function __construct($attributes = array()) 
    { 
     parent::__construct($attributes); 

     if (isset(self::$staticMakeVisible)){ 
      $this->makeVisible(self::$staticMakeVisible); 
     } 
    } 
..... 

    public function __destruct() 
    { 
     self::$staticMakeVisible = null; 
    } 

} 

Und in meiner Beziehung verwende ich so etwas wie dieses, was es ist

class User extends Authenticatable 
{ 
... 
    public function extensions() 
    { 
     $class = Extension::class; 
     $class::$staticMakeVisible = ['password']; 

     return $this->belongsToMany(Extension::class, 'v_extension_users', 'user_uuid', 'extension_uuid'); 
    } 
... 
} 
0

Hidden Felder werden nicht ausgefüllt, wenn die folgenden Methoden verwendet werden toArray() oder toJson(). Versuchen dd($extension->toJson());

jedoch das Feld noch zur Verfügung steht, wenn die Verwendung explizit wie folgt aus:

$extension->password; 

Mehr Infos hier: https://laravel.com/docs/5.4/eloquent-serialization#hiding-attributes-from-json

+0

jetzt über ich frage. Ich weiß, wie man das Attribut direkt bekommt. Ich übergebe später mein ** seqesToMany ** -Ergebnis an die Json-Ausgabe, also muss ich einige Felder dynamisch ein-/ausblenden. – Gruz

3

->makeVisible([...]) funktionieren sollte:

$model = \Model::first(); 
$model->makeVisible(['password']); 

$models = \Model::get(); 
$models = $models->each(function ($i, $k) { 
    $i->makeVisible(['password']); 
}); 

// belongs to many/has many 
$related = $parent->relation->each(function ($i, $k) { 
    $i->makeVisible(['password']); 
}); 

// belongs to many/has many - with loading 
$related = $parent->relation()->get()->each(function ($i, $k) { 
    $i->makeVisible(['password']); 
}); 
+0

Ich müde diesen Ansatz, aber konnte nicht finden, was ich schreiben muss, um von meinen 'öffentlichen Funktionserweiterungen()' ein Ergebnis mit sichtbarem Passwort zurückzugeben. Wenn ich 'Model :: get()' Collection anstelle von 'Illuminate \ Database \ Eloquent \ Relations \ BelongsToMany' von der Methode zurückbringe, werden alle anderen Dinge durchgebrannt. Sie bieten an, den Typ der zurückkehrenden Beziehungsdaten zu ändern. Hier https://laravel.com/docs/5.4/eloquent-relationships gibt es so etwas zurück wie 'return $ this-> gehört zu ('App \ User');' aber nicht 'return $ this-> givesTo ('App \ User ') -> get(); ' – Gruz

+0

Meine Antwort wurde aktualisiert. Die letzten 2 werden aus einer Beziehung geladen. Erstens nimmt man an, dass man seine Beziehung schon einmal geladen hat, zweitens, man lädt es auf dem Sprung. – devk

+0

Ich sehe nicht, wie ich meine 'öffentlichen Funktionserweiterungen()' ändern kann, um das Passwortfeld sichtbar zu bekommen. – Gruz

Verwandte Themen