2014-06-30 2 views
6

Ho due modelli nella mia applicazione web Laravel 4.2, User e Group. Un utente può essere membro di molti gruppi e un gruppo può avere molti membri. Entrambi i modelli sono quindi uniti con una relazione molti-a-molti:Laravel - Selezione di colonne specifiche su relazioni molti-a-molti

<?php 
    class User extends Eloquent { 
     public function groups() 
     { 
      return $this->belongsToMany('Group'); 
     } 
    } 

    class Group extends Eloquent { 
     public function users() 
     { 
      return $this->belongsToMany('User'); 
     } 
    } 
?> 

Una delle mie risorse API è /groups, che elenca tutti i gruppi disponibili all'interno dell'applicazione:

<?php 
    $groups = Group::with('users')->all(); 
?> 

Questo funziona, ma in la risposta JSON ogni utente contiene tutti i campi dalla tabella users (esclusi ovviamente quelli nell'attributo $hidden). Vorrei che questa relazione restituisse solo un insieme specifico di campi anziché l'intera tabella.

In altri tipi di relazione posso facilmente raggiungere questo obiettivo con la seguente affermazione (presumo ora che gli utenti possono appartenere a un solo gruppo):

<?php 
    public function users() 
    { 
     return $this->hasMany('User')->select(['id', 'first_name', 'last_name']); 
    } 
?> 

Tuttavia quanto sopra non sembra funzionare con molti-a- molte relazioni. Mi sono imbattuto in this question che apparentemente si riferisce allo stesso problema e sembra che questo non fosse possibile in Laravel 4.1. L'autore della risposta scelta, tptcat, fornisce un collegamento a un problema sul rilevatore di problemi Github di Laravel, ma il collegamento non funziona più e non sono in grado di capire se questo problema è ancora aperto in 4.2.

Qualcuno si è imbattuto in questo ed è riuscito a risolverlo con successo?

risposta

0

Il metodo all accetta come parametro un array di nomi di colonne.

Se si guarda la fonte, ci vuole * (che significa tutto) per impostazione predefinita.

https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L624-L629

È possibile passare nelle colonne che è necessaria e dovrebbe restituire i risultati solo con le colonne specificate.

<?php 

$groups = Group::with('users')->all(array('first_column', 'third_column')); 
+0

Sì, questo funziona. Tuttavia, se faccio query simili in diverse azioni in tutto il mio controller, devo passare lo stesso array a tutte loro. Stavo mirando a una soluzione simile a ciò che si può fare con altri tipi di relazioni. – cafonso

+0

È sempre possibile creare una funzione che fa queste query comuni nel modello e chiamarla dalle diverse azioni nei controller. – Oni

0

Utilizzare in questo modo.

<?php 
    class User extends Eloquent { 
     public function groups() 
     { 
      return $this->belongsToMany('Group')->select(array('id', 'name')); 
     } 
    } 

    class Group extends Eloquent { 
     public function users() 
     { 
      return $this->belongsToMany('User')->select(array('id', 'name')); 
     } 
    } 
?>