2016-06-16 19 views
5

Mi spiace per il titolo non esplicativo ma non sono riuscito a trovare uno descrittivo.Laravel: JSON e tabella pivot

ho i seguenti 3 tabelle: - Giochi - piattaforme - games_platforms

E io ho 2 Modelli in laravel sia per piattaforma e Game.

public function games() 
{ 
    return $this->belongsToMany('App\Game', 'games_platforms')->withPivot('release_date'); 
} 

public function platforms() 
{ 
    return $this->belongsToMany('App\Platform', 'games_platforms')->withPivot('release_date'); 
} 

Ora, questo funziona come un fascino, ottengo una stringa JSON con tutte le informazioni contenute nelle tabelle 3, come questo.

[{ 
    "id": 1, 
    "name": "Borderlands", 
    "short_description": "", 
    "created_at": null, 
    "updated_at": null, 
    "platforms": [{ 
     "id": 4, 
     "name": "PC", 
     "pivot": { 
      "game_id": 1, 
      "platform_id": 4, 
      "release_date": "2016-03-03" 
     } 
    }] 
}] 

Ora il mio problema è il seguente. Io non voglio mostrare tutta l'informazione 'perno', proprio il 'RELEASE_DATE', in questo modo:

"platforms": [{ 
     "id": 4, 
     "name": "PC", 
     "release_date": "2016-03-03" 

C'è un modo facile in laravel di fare una cosa simile? Per quanto posso vedere ora, guardando altri post, è necessario scrivere una funzione che trasformi il json in un array e io posso organizzarlo in quel momento. Oppure posso scrivere la mia query invece di lasciare che Laravel faccia tutto questo.

Spero che voi ragazzi potete aiutarmi con questo problema. Grazie!

+0

So che Laravel supporta il caricamento impaziente fuori dalla scatola con sintassi molto comprensibile. Non l'ho mai usato su tabelle pivot, ma forse provarlo? Qualcuno lo ha fatto qui e la risposta sembrava aiutare: https://laracasts.com/discuss/channels/eloquent/eager-loading-pivot-tables Anche questa domanda precedente sembra avere una risposta molto decente: http: // StackOverflow. it/questions/21645257/generando-clean-formatted-json-with-laravel-pivot-tables? rq = 1 – Loek

risposta

4

vorrei modificare i dati restituiti dalla query tramite i metodi della classe collezione:

//replace Game::all() with your actual query 
return Game::all()->each(function($game){ 
    $game->platforms->map(function($platform){ 
     $platform->release_date = $platform->pivot->release_date; 
     unset($platform->pivot); 
     return $platform; 
    }); 
}); 
+0

Brillante, questo è quello che stavo cercando. Grazie. – Serellyn

+0

@Serellyn felice di poterti aiutare – Steve

0

So che questo è già una risposta, ma credo che la risposta corretta sarebbe quella di aggiungere tutto ciò che si desidera nascondere al vostro attributo nascosto sul modello.

<?php 
class Games extends Eloquent 
{ 
    protected $hidden = ['pivot.game_id', 'pivot.platform_id']; 
} 

Non sono sicuro quali sono le chiavi perché sono diverse nei due esempi. Si prega di vedere: https://github.com/laravel/framework/issues/745

Problemi correlati