J'ai 2 tables jointes dans Eloquent, à savoir les thèmes et les utilisateurs.
modèle de thème:
public function user() {
return $this->belongs_to('User');
}
modèle d'utilisateur:
public function themes() {
return $this->has_many('Theme');
}
Mon appel API Eloquent ressemble à ceci:
return Response::eloquent(Theme::with('user')->get());
Ce qui renvoie toutes les colonnes du thème (c'est bien) et toutes les colonnes de l'utilisateur (pas bien). Je n'ai besoin que de la colonne «nom d'utilisateur» du modèle utilisateur, comment puis-je limiter la requête à cela?
Response
type de classe que je dois importer?Réponses:
Modifiez votre modèle pour spécifier les colonnes que vous souhaitez sélectionner:
Et n'oubliez pas d'inclure la colonne sur laquelle vous vous joignez.
la source
Pour Laravel> = 5,2
Utilisez la méthode -> pluck ()
Pour Laravel <= 5.1
Utilisez la méthode -> lists ()
la source
Vous pouvez fournir un tableau de champs dans le paramètre get comme ceci:
MISE À JOUR (pour Laravel 5.2) À partir de la documentation , vous pouvez faire ceci:
la source
SQLSTATE[42S22]: Column not found
et c'est SQL n'inclut pas la table dans le fichierwith
. Le sql qui apparaît sur l'erreur est "SELECT fk_table.column1 FROM main_table".Je sais, vous demandez Eloquent mais vous pouvez le faire avec Fluent Query Builder
la source
C'est comme ça que je fais
La première réponse de l'utilisateur2317976 n'a pas fonctionné pour moi, j'utilise laravel 5.1
la source
pivot
à $ tableau caché de Post Modelprotected $hidden = ['pivot']
Une autre option consiste à utiliser la
$hidden
propriété du modèle pour masquer les colonnes que vous ne souhaitez pas afficher. Vous pouvez définir cette propriété à la volée ou définir des valeurs par défaut sur votre modèle.Désormais, le mot de passe des utilisateurs sera masqué lorsque vous renvoyez la réponse JSON.
Vous pouvez également le configurer à la volée de la même manière.
la source
static
.Utilisation avec pagination
la source
user2317976 a introduit une excellente façon statique de sélectionner les colonnes des tables associées.
Voici une astuce dynamique que j'ai trouvée pour que vous puissiez obtenir ce que vous voulez lorsque vous utilisez le modèle:
Je viens de trouver que cette astuce fonctionne également bien avec load (). Ceci est très pratique.
Assurez-vous d'inclure également la clé de la table cible, sinon elle ne pourra pas la trouver.
la source
Par ici:
la source
Je sais que c'est une vieille question, mais si vous créez une API, comme le fait l'auteur de la question, utilisez des transformateurs de sortie pour effectuer de telles tâches.
Transofrmer est une couche entre le résultat réel de votre requête de base de données et un contrôleur. Il permet de contrôler et de modifier facilement ce qui va être envoyé à un utilisateur ou à un consommateur d'API.
Je recommande Fractal comme base solide de votre couche de transformation de sortie. Vous pouvez lire la documentation ici .
la source
Dans Laravel 4, vous pouvez masquer certains champs contre le retour en ajoutant ce qui suit dans votre modèle.
http://laravel.com/docs/eloquent#converting-to-arrays-or-json
la source
Sur Laravel 5.5, le moyen le plus propre de le faire est:
Vous ajoutez deux points et les champs que vous souhaitez sélectionner séparés par une virgule et sans espace entre eux.
la source
Utilisation du modèle:
Utilisation de Query Builder:
la source
Si j'ai bien compris, ce qui est renvoyé est bien sauf que vous ne voulez voir qu'une seule colonne. Si tel est le cas, cela devrait être beaucoup plus simple:
la source
Consultez, http://laravel.com/docs/database/eloquent#to-array
Vous devriez pouvoir définir les colonnes que vous ne souhaitez pas afficher dans votre api.
la source