2013-06-19 17 views
14

Attualmente ho alcuni modelli che hanno molte o molte relazioni tramite laravel. qui è la struttura:Utilizzo degli accessor con campi della tabella pivot in Eloquent

users 
    id 
    username 
    ... 

games 
    id 
    title 
    ... 

game_user 
    game_id 
    user_id 
    system 

Ora, i miei modelli sembrano un po 'come questo:

<?php 

class Game extends Eloquent 
{ 
    /** 
    * A game is owned by many users 
    * 
    * @return mixed 
    */ 
    public function user() 
    { 
     return $this->belongsToMany('User')->withPivot('system'); 
    } 


<?php 

class User extends Eloquent 
{ 
    /** 
    * A user has many games. 
    * 
    * @return mixed 
    */ 
    public function games() 
    { 
     return $this->belongsToMany('Game')->withPivot('system'); 
    } 

Ora, tutto questo funziona bene. Tuttavia, desidero utilizzare un mutatore sul campo di sistema dalla tabella pivot. Non riesco a trovare alcuna documentazione su questo e il seguente (in modelli sia per l'utente e di gioco) non funziona:

public function getSystemAttribute($val) 
{ 
    return $val.' Testing'; 
} 
+0

è possibile scaricare i dati della tabella –

+0

posso farlo, ma è molto semplice. – euantorano

risposta

2

ho trovato questa domanda interessante, così ho iniziato a giocare con il codice.

Se è necessario accedere a una voce specifica, ecco la mia soluzione:

public function getSystemAttribute($game){ 
    foreach($this->games as $value){ 
     if($value->id==$game->id){ 
      $value->pivot->system = 'foo'; 
      $value->pivot->save(); 
     } 
    } 
} 

che si può chiamare semplicemente con:

$user->getSystemAttribute($game) 

Per quanto riguarda la funzione di accesso, non ho potuto trovare qualsiasi in altro modo senza itarare la collezione. Ci sono modi più carini per iterare la collezione, ma questo non era lo scopo di questa domanda. Da documentation, è possibile vedere come è possibile accedere a qualsiasi attributo della tabella pivot.

Spero che questo aiuti

+0

Grazie! Stavo guardando in giro come un matto su un modo per aggiungere i dati alla tabella pivot, non accedervi e non ho trovato nulla da nessuna parte. Tutto riguarda solo il collegamento di pivot, non preoccuparsi delle colonne di dati ... –

8

non ho ancora testato, ma questo dovrebbe funzionare.

public function getSystemAttribute($value) 
{ 
    return $this->pivot->system . ' Testing'; 
} 

... 

foreach ($user->games as $game) 
{ 
    echo $game->system; 
} 

Il valore ottenendo passato è essere tirato dai modelli attributi. Non esiste un attributo di sistema quindi è necessario ottenere NULL. Possiamo semplicemente ignorarlo e tirare direttamente il valore dalla tabella pivot.

+1

Non è necessario l'argomento $ value in là. –

+0

Per accedere all'attributo * system * (in views/controller) è necessario aggiungere il nome dell'attributo alla proprietà 'appends' sul modello prima – ira

1

Se si desidera essere in grado di inserire l'attributo system modificato nella risposta (JSON, ecc.), È necessario aggiungere quanto segue a entrambi i modelli (gioco + utente).

protected $appends = array('system'); 
+1

Solo per il record, questo è valido se si utilizza Laravel> = 4.0 .8. Inoltre, avresti ancora bisogno dell'accessorio di attributo 'sistema' per rendere effettiva questa direttiva. – Gadoma

0

Il mio problema principale è che ho alcuni oggetti JSON codificato memorizzati come testo nella mia tabella pivot. Mi piacerebbe codificarli e decodificarli automaticamente.

Quindi quello che mi è venuto in mente, a causa della mancanza di un'alternativa reale, è una soluzione di base per la funzionalità accessor (json decode). Per prima cosa ho provato a utilizzare lo approach provided by Collin James ma non mi piace il fatto che venga creato un nuovo attributo personalizzato invece di manipolare pivot->random_attribute.

Nelle mie tabelle ho sempre un attributo id, quindi ho scritto un accessor per l'attributo id e incluso la manipolazione dei dati pivot.

public function getIdAttribute($id) { 

    //Decode random_attribute 
    if(isset($this->pivot->random_attribute)) { 
     $this->pivot->random_attribute = json_decode($this->pivot->random_attribute); 
    } 

    return $id; 
} 

Purtroppo non sono riuscito a gestire il mutatore in un modo simile. Ma per me l'accessor è molto più importante.

1

È necessario definire un accessorio per la proprietà system del perno e aggiungere il nome dell'attributo alla proprietà di accodamento sul modello.L'intera procedura segue

1) Definire una funzione di accesso nel modello genitore da cui vogliamo accedere all'attributo:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Game extends Model 
{ 
    /** 
    * The accessors to append to the model's array form. 
    * 
    * @var array 
    */ 
    public function getSystemAttribute() // the name can be anything e.g getFooAttribute 
    { 
     return $this->pivot->system; 
    } 
} 

2) (per evitare di essere NULL) Aggiungere il nome di attributo! alla proprietà di accodamento sul modello (vedere here).

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Book extends Model 
{ 
    /** 
    * The accessors to append to the model's array form. 
    * 
    * @var array 
    */ 
    protected $appends = ['system']; 
} 

3) Ora è possibile accedere a tale nuovo creato system attributo dal Modello genitore:

$user = App\User::find($id); 
foreach ($user->games as $game) 
{ 
    echo $game->system; 
} 

Naturalmente, come con ogni funzione di accesso, si potrebbe anche "alter" il valore della tabella pivot prima di accedervi, per esempio:

public function getSystemAttribute() 
{ 
    return $this->pivot->foo .'Hello word!'; //append the ""Hello word!" string to the end of the `foo` attribute value 
} 

Infine si noti che il nome della funzione di accesso può essere qualsiasi cosa come 0.123., getBarAttribute, getBarBazAttribute. In tal caso l'accodamento sarebbe protetto $appends = ['foo']; e si potrebbe ancora accedere alla proprietà del perno foo tramite il Modello genitore come $game->foo

Problemi correlati