Laravel Éloquent: Comment obtenir seulement certaines colonnes de tables jointes
J'ai 2 tables jointes dans Éloquent à savoir les thèmes et les utilisateurs.
thème modèle:
public function user() {
return $this->belongs_to('User');
}
de l'utilisateur modèle:
public function themes() {
return $this->has_many('Theme');
}
Mon Éloquent appel d'api ressemble comme ci-dessous:
return Response::eloquent(Theme::with('user')->get());
Qui renvoie toutes les colonnes de thème (c'est bien), et toutes les colonnes de l'utilisateur (pas très bien). J'ai seulement besoin de le 'nom d'utilisateur' colonne dans le modèle de l'utilisateur, comment puis-je limiter la requête de qui?
Vous devez vous connecter pour publier un commentaire.
Changer de modèle pour spécifier les colonnes que vous souhaitez utiliser:
Et n'oubliez pas d'inclure la colonne que vous êtes le rejoindre sur.
Pour Laravel >= 5.2
Utiliser le ->arracher() méthode
Pour Laravel <= 5.1
Utiliser le ->listes() méthode
Vous pouvez fournir un tableau de champs dans le paramètre comme suit:
Mise à JOUR (pour Laravel 5.2)
À partir de la docs, vous pouvez le faire:
SQLSTATE[42S22]: Column not found
et c'est SQL ne pas inclure la table dans lewith
. Le sql qu'il apparaît sur l'erreur est "SÉLECTIONNEZ fk_table.colonne1 DE main_table".Je sais, vous vous demandez Éloquent, mais vous pouvez le faire avec Couramment Le Générateur De Requête
C'est comment je le fais
Première réponse user2317976 ne fonctionne pas pour moi, je suis l'aide de laravel 5.1
pivot
de dollars cachés éventail de Modèle Postprotected $hidden = ['pivot']
->join('products','products.id','id)->select('stock.*','product.name')
Une autre option est de faire usage de la
$hidden
propriété sur le modèle de masquer les colonnes que vous ne souhaitez pas afficher. Vous pouvez définir cette propriété à la volée ou de définir des valeurs par défaut sur votre modèle.Maintenant le mot de passe des utilisateurs sont masquées lorsque vous retournez la réponse JSON.
Vous pouvez également configurer à la volée dans une manière similaire.
static
.À l'aide de la pagination
user2317976 a introduit un grand statique de la façon de sélectionner les tables associées " colonnes.
Voici une dynamique truc que j'ai trouvé, de sorte que vous pouvez obtenir ce que vous voulez lors de l'utilisation du modèle:
Je viens de trouver cette astuce fonctionne aussi bien avec load() aussi. C'est très pratique.
Assurez-vous d'inclure également la cible de la table de touche sinon il ne sera pas capable de le trouver.
De Cette Façon:
Je sais que c'est une vieille question, mais si vous êtes la construction d'une API, comme l'auteur de la question, l'utilisation de transformateurs de sortie pour accomplir de telles tâches.
Transofrmer est une couche entre votre base de données de résultats de la requête et d'un contrôleur. Il permet de facilement contrôler et modifier ce qui se passe à la sortie d'un utilisateur ou d'une API de consommation.
Je recommande Fractal comme une base solide de votre sortie de la transformation de la couche. Vous pouvez lire la documentation ici.
Dans Laravel 4, vous pouvez masquer certains champs de retournés en ajoutant la ligne suivante dans votre modèle.
http://laravel.com/docs/eloquent#converting-to-arrays-or-json
Sur Laravel 5.5, la façon la plus propre de le faire est:
Vous ajoutez un signe deux-points et les champs que vous souhaitez sélectionner séparés par une virgule et sans espace entre eux.
À L'Aide De Modèle:
En Utilisant Le Générateur De Requêtes:
Si j'ai bien compris ce qu'est retourné est bien sauf que vous voulez voir sur une seule colonne. Si donc ce ci-dessous devrait être beaucoup plus simple:
Découvrez, http://laravel.com/docs/database/eloquent#to-array
Vous devriez être en mesure de définir les colonnes que vous ne voulez pas affiché dans votre api.