Comment sélectionner des colonnes spécifiques dans laravel éloquent


138

disons que j'ai 7 colonnes dans le tableau, et je veux en sélectionner seulement deux, quelque chose comme ça

SELECT `name`,`surname` FROM `table` WHERE `id` = '1';

Dans le modèle éloquent de laravel, cela peut ressembler à ceci

Table::where('id', 1)->get();

mais je suppose que cette expression sélectionnera TOUTES les colonnes où id est égal à 1, et je ne veux que deux colonnes (nom, prénom). comment sélectionner seulement deux colonnes?


Merci d'avoir posé la question. C'est fou, car je l'ai toujours fait correctement dans les requêtes SQL `` classiques '', mais devant utiliser Eloquent, j'ai trouvé cela tellement déroutant que j'étais content de le faire fonctionner, et j'étais inconscient de la quantité de mémoire que mes requêtes utilisaient parce que je sélectionnait tout.
Jonny Perl

Réponses:


224

Vous pouvez le faire comme ceci:

Table::select('name','surname')->where('id', 1)->get();

1
supposons que je veuille sélectionner tous les champs, attendez-en un comment puis-je faire cela
Prince Arora

2
Tout d'abord, lorsque vous avez une question, posez-en une. Et pour votre cas, mentionnez simplement toutes les colonnes au lieu de celle que vous ne souhaitez pas inclure. C'est si facile.
Marcin Nabiałek

2
n'y a-t-il pas d'autre méthode pour le faire sans mentionner toutes les colonnes
Prince Arora

1
Cela fonctionne pour un cas de base avec une seule table. Cependant, si vous utilisez une relation sur un tableau croisé dynamique, cela sélectionnera ÉGALEMENT les colonnes pivotantes, automatiquement.
Benubird

1
@OPV Il exécute juste une SELECT name, surname FROM Table where id = 1requête SQL
Marcin Nabiałek

67
Table::where('id', 1)->get(['name','surname']);

Je veux la même chose mais en utilisant une méthode différente. Je souhaite sélectionner une méthode en créant une instance de modèle, puis en sélectionnant la colonne. ie $ model = new MyModel (); $ model-> select (['col1', 'col2']); Mais cette chose ne fonctionne pas
Dhirender

49

En utilisant la méthode all (), nous pouvons sélectionner des colonnes particulières dans le tableau comme indiqué ci-dessous.

ModelName::all('column1', 'column2', 'column3');

Remarque : Laravel 5.4


Je veux la même chose mais en utilisant une méthode différente. Je souhaite sélectionner une méthode en créant une instance de modèle, puis en sélectionnant la colonne. ie $ model = new MyModel (); $ model-> select (['col1', 'col2']); Mais cette chose ne fonctionne pas.
Dhirender

37

Vous pouvez aussi utiliser find() comme ceci:

ModelName::find($id, ['name', 'surname']);

La $idvariable peut être un tableau au cas où vous auriez besoin de récupérer plusieurs instances du modèle.


24

De plus, Model::all(['id'])->toArray()il ne récupérera l'identifiant que sous forme de tableau.


17

Vous devez d'abord créer un modèle, qui représente cette table, puis utiliser la méthode éloquente ci-dessous pour récupérer les données de seulement 2 champs.

Model::where('id', 1)
         ->pluck('name', 'surname')
         ->all();

C'est la meilleure réponse car elle fonctionne également avec les tableaux croisés dynamiques dans plusieurs à plusieurs relations.
Luciano Fantuzzi

8

Vous pouvez utiliser get () ainsi que all ()

ModelName::where('a', 1)->get(['column1','column2']);

4

Vous pouvez également utiliser du pincement.

Model::where('id',1)->pluck('column1', 'column2');

6
Notez que pluck()c'est moins efficace que les autres méthodes décrites car cela ne modifie pas la SELECT ...requête, mais plutôt, il fonctionne sur le jeu de résultats déjà renvoyé.
Ben Johnson

4

Obtenez la valeur d'une colonne:

Table_Name::find($id)->column_name;

Même vous pouvez utiliser cette méthode avec la clause where:

Table_Name::where('id',$id)->first()->column_name;

dans le générateur de requêtes:

DB::table('table_names')->find($id)->column_name;

avec où cluase:

DB::table('table_names')->where('id',$id)->first()->column_name;

ou

DB::table('table_names')->where('id',$id)->first('column_name');

le dernier résultat de la méthode est un tableau


3

Vous pouvez utiliser Table::select ('name', 'surname')->where ('id', 1)->get ().

Gardez à l'esprit que lorsque vous sélectionnez uniquement certains champs, vous devrez effectuer une autre requête si vous finissez par accéder à ces autres champs plus tard dans la demande (cela peut être évident, je voulais simplement inclure cette mise en garde). L'inclusion du champ id est généralement une bonne idée afin que laravel sache comment réécrire toutes les mises à jour que vous effectuez sur l'instance de modèle.


3

À partir de laravel 5.3 en utilisant uniquement la get()méthode, vous pouvez obtenir des colonnes spécifiques de votre table:

YouModelName::get(['id', 'name']);

Ou à partir de laravel 5.4, vous pouvez également utiliser la all()méthode pour obtenir les champs de votre choix:

YourModelName::all('id', 'name');

avec les deux méthodes ci-dessus get()ou all()vous pouvez également utiliser where()mais la syntaxe est différente pour les deux:

Modèle :: all ()

YourModelName::all('id', 'name')->where('id',1);

Modèle :: get ()

YourModelName::where('id',1)->get(['id', 'name']);

3

Pour obtenir le résultat d'une colonne spécifique à partir de la table, nous devons spécifier le nom de la colonne.

Utilisez le code suivant: -

   $result = DB::Table('table_name')->select('column1','column2')->where('id',1)->get();  

par exemple -

$result = DB::Table('Student')->select('subject','class')->where('id',1)->get();  

Veuillez ajouter quelques explications à votre réponse afin que les autres puissent en tirer des leçons
Nico Haase

2

Bien que l'approche la plus courante soit l'utilisation Model::select, elle peut entraîner le rendu de tous les attributs définis avec des méthodes d'accesseur dans les classes de modèle. Donc, si vous définissez un attribut dans votre modèle:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the user's first name.
     *
     * @param  string  $value
     * @return string
     */
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}

Et puis utilisez: TableName::select('username')->where('id', 1)->get();

Il affichera la collection avec les deux first_nameet username, plutôt que le seul nom d'utilisateur.

Meilleure utilisation pluck(), en solo ou éventuellement en combinaison avec select- si vous voulez des colonnes spécifiques.

TableName::select('username')->where('id', 1)->pluck('username');

ou

TableName::where('id', 1)->pluck('username'); // qui renverrait une collection composée uniquement de usernamevaleurs

Également, éventuellement, utiliser ->toArray()pour convertir l'objet de collection en tableau.


1

->get()un peu comme ->all()(et ->first()etc.) peut prendre les champs que vous voulez ramener comme paramètres;

->get/all(['column1','column2'])

Je ramènerais la collection mais seulement avec column1etcolumn2


1

vous pouvez également utiliser la findOrFail()méthode ici, il est bon d'utiliser

si l'exception n'est pas interceptée, une réponse HTTP 404 est automatiquement renvoyée à l'utilisateur. Il n'est pas nécessaire d'écrire des vérifications explicites pour renvoyer 404 réponses lorsque ces méthodes ne donnent pas d'erreur 500.

ModelName::findOrFail($id, ['firstName', 'lastName']);

1

Si vous souhaitez obtenir une seule ligne et à partir de la colonne unique de cette ligne, un code de ligne pour obtenir la valeur de la colonne spécifique est d'utiliser find() méthode en plus de spécifier la colonne que vous souhaitez récupérer.

Voici un exemple de code:

ModelName::find($id_of_the_record, ['column_name'])->toArray()['column_name'];

0

Vous pouvez utiliser la requête ci-dessous:

Table('table')->select('name','surname')->where('id',1)->get();

1
Veuillez ajouter quelques explications à votre réponse afin que les autres puissent en tirer des leçons
Nico Haase

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.