2014-10-25 11 views
32

Ho un telefono_models, phone_problems e una tabella pivot phone_model_phone_problem. La tabella pivot ha un "prezzo" di colonna in più.ottenere il valore di una colonna di tabella pivot aggiuntiva laravel

PhoneModel:

class PhoneModel extends \Eloquent 
{ 
    public function problems() 
    { 
     return $this->belongsToMany('RL\Phones\Entities\PhoneProblem')->withPivot('price'); 
    } 
} 

PhoneProblem:

class PhoneProblem extends \Eloquent 
{ 
    public function models() 
    { 
     return $this->belongsToMany('PhoneModel')->withPivot('price'); 
    } 
} 

Quello che sto cercando di fare è ottenere il prezzo di un telefono specifico con un problema specifico.

Ecco come ce l'ho, ma ora mi sento come laravel ha costruito in funzione Eloquente non riesco a trovare per fare questo in un modo molto più semplice:

$model = $this->phoneService->getModelFromSlug($model_slug); 
$problem = $this->phoneService->getProblemFromSlug($problem_slug); 

Tutto questo non fa selezionare la specifica modello e problema dalla loro lumaca.

allora quello che faccio è con queste credenziali che ricevo il prezzo in questo modo:

$row = DB::table('phone_model_phone_problem') 
->where('phone_model_id', '=', $model->id) 
->where('phone_problem', '=', $problem->id) 
->first(); 

così ora posso ottenere il prezzo in questo modo $row->price ma mi sento come se ci deve essere un molto più facile e più ' Il modo di Laravel per farlo.

risposta

71

Quando si utilizzano relazioni da molti a molti con Eloquent, il modello risultante ottiene automaticamente un attributo pivot assegnato. Attraverso quell'attributo puoi accedere alle colonne della tabella pivot. Sebbene di default ci siano solo le chiavi nell'oggetto pivot. Per ottenere le colonne anche lì, è necessario specificare quando la definizione del rapporto:

return $this->belongsToMany('Role')->withPivot('foo', 'bar'); 

Official Docs

Se avete bisogno di più aiutare il compito di configurare i rapporti con Eloquente, me lo faccia sapere.

Modifica

Per interrogare il prezzo fare questo

$model->problems()->where('phone_problem', $problem->id)->first()->pivot->price 
+0

ho già impostato il rapporto che sto cercando di recuperarlo – Rodrigo

+0

Ho aggiornato la mia domanda per voi a vedere le mie relazioni – Rodrigo

+0

@ user3666882 Grazie, I' Ho aggiornato anche la mia risposta – lukasgeiter

5

Per ottenere dati dalla tabella pivot:

$price = $model->problems()->findOrFail($problem->id, ['phone_problem'])->pivot->price; 

Oppure, se si dispone di molti record con prezzo diverso:

$price = $model->problems()->where('phone_problem', $problem->id)->firstOrFail()->pivot->price; 

Inoltre.

To aggiornamento dati del perno si può andare NUOVO MODO:

$model->problems()->sync([$problemId => [ 'price' => $newPrice] ], false); 

Dove seconda param impostato su false mezzi, che non si stacca tutti gli altri modelli correlati.

Oppure andare vecchio modo

$model->problems()->updateExistingPivot($problemId, ['price' => $newPrice]); 

E ricordare:

Per elimina:

$model->problems()->detach($problemId); 

Per creare nuovo:

$model->problems()->attach($problemId, ['price' => 22]); 

E 'stato testato e provato a lavorare in laravel 5.1 Read more.

Problemi correlati