Come selezionare colonne specifiche in Laravel eloquent


138

diciamo che ho 7 colonne nella tabella e voglio selezionarne solo due, qualcosa del genere

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

Nel modello eloquente di laravel potrebbe apparire così

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

ma immagino che questa espressione selezionerà TUTTE le colonne dove id è uguale a 1 e voglio solo due colonne (nome, cognome). come selezionare solo due colonne?


Grazie per aver posto la domanda. È pazzesco perché l'ho sempre fatto correttamente nelle query SQL "classiche", ma dovendo usare Eloquent, l'ho trovato così confuso che ero felice solo di farlo funzionare ed ero ignaro di quanta memoria le mie query stessero usando perché stava selezionando tutto.
Jonny Perl,

Risposte:


224

Puoi farlo in questo modo:

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

1
supponiamo che io voglia selezionare ogni campo aspettandone uno come posso farlo
Prince Arora

1
Prima di tutto, quando hai domande, chiedine una. E per il tuo caso, menziona solo tutte le colonne anziché quella che non vuoi includere. È così facile
Marcin Nabiałek,

2
non c'è nessun altro metodo per farlo senza menzionare tutte le colonne
Prince Arora

1
Questo funziona per un caso di base con una sola tabella. Tuttavia, se si utilizza una relazione su una tabella pivot, questo selezionerà ANCHE automaticamente le colonne pivot.
Benubird,

1
@OPV Esegue solo una SELECT name, surname FROM Table where id = 1query SQL
Marcin Nabiałek,

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

Voglio la stessa cosa ma usando un metodo diverso. Voglio selezionare il metodo creando l'istanza del modello e quindi selezionare la colonna. cioè $ model = new MyModel (); $ model-> select (['col1', 'col2']); Ma questa cosa non funziona
Dhirender il

49

Usando il metodo all () possiamo selezionare colonne particolari dalla tabella come mostrato di seguito.

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

Nota : Laravel 5.4


Voglio la stessa cosa ma usando un metodo diverso. Voglio selezionare il metodo creando l'istanza del modello e quindi selezionare la colonna. cioè $ model = new MyModel (); $ model-> select (['col1', 'col2']); Ma questa cosa non funziona.
Dhirender,

37

Puoi anche usare find()così:

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

La $idvariabile può essere una matrice nel caso in cui sia necessario recuperare più istanze del modello.


24

Inoltre Model::all(['id'])->toArray()recupererà id come array.


17

Devi prima creare un modello che rappresenti quella tabella e quindi utilizzare il modo eloquente di seguito per recuperare i dati di soli 2 campi.

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

Questa è la risposta migliore poiché funziona anche con le tabelle pivot in molte o molte relazioni.
Luciano Fantuzzi,

8

Puoi usare get () e all ()

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

4

Inoltre puoi usare pluck.

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

6
Si noti che pluck()è meno efficiente rispetto agli altri metodi discussi perché non modifica la SELECT ...query, ma piuttosto opera sul set di risultati già restituito.
Ben Johnson,

4

Ottieni il valore di una colonna:

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

Anche tu puoi usare questo metodo con la clausola where:

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

nel generatore di query:

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

con dove cluase:

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

o

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

il risultato dell'ultimo metodo è array


3

È possibile utilizzare Table::select ('name', 'surname')->where ('id', 1)->get ().

Tieni presente che quando selezioni solo per determinati campi, dovrai fare un'altra query se finisci per accedere a quegli altri campi più avanti nella richiesta (che può essere ovvio, volevo solo includere quell'avvertimento). Includere il campo ID è di solito una buona idea, quindi laravel sa come riscrivere eventuali aggiornamenti sull'istanza del modello.


3

Da laravel 5.3 solo usando il get()metodo puoi ottenere colonne specifiche della tua tabella:

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

Oppure da laravel 5.4 puoi anche usare il all()metodo per ottenere i campi di tua scelta:

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

con entrambi i metodi di cui sopra get()oppure all()puoi anche usare where()ma la sintassi è diversa per entrambi:

Modello :: tutti ()

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

Modello :: get ()

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

3

Per ottenere il risultato di una colonna specifica dalla tabella, dobbiamo specificare il nome della colonna.

Usa il seguente codice: -

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

per esempio -

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

Per favore aggiungi qualche spiegazione alla tua risposta in modo che altri possano imparare da essa
Nico Haase,

2

Mentre l'approccio più comune è l'uso Model::select, può causare il rendering di tutti gli attributi definiti con i metodi di accesso all'interno delle classi del modello. Quindi se definisci l'attributo nel tuo modello:

<?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);
    }
}

E poi usa: TableName::select('username')->where('id', 1)->get();

Produrrà la raccolta con entrambi first_namee username, piuttosto che solo nome utente.

Meglio usare pluck(), da solo o opzionalmente in combinazione con select- se vuoi colonne specifiche.

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

o

TableName::where('id', 1)->pluck('username'); // che restituirebbe una raccolta costituita da soli usernamevalori

Inoltre, facoltativamente, utilizzare ->toArray()per convertire l'oggetto di raccolta in array.


1

->get()proprio come ->all()(ed ->first()ecc.) possono prendere i campi che si desidera riportare come parametri;

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

Riporterebbe la collezione ma solo con column1ecolumn2


1

puoi anche usare il findOrFail()metodo qui è buono da usare

se l'eccezione non viene rilevata, una risposta HTTP 404 viene automaticamente inviata all'utente. Non è necessario scrivere controlli espliciti per restituire 404 risposte quando si utilizza questo metodo per non dare un errore 500.

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

1

Se si desidera ottenere una riga singola e dalla colonna singola di quella riga, un codice di riga per ottenere il valore della colonna specifica è utilizzare il find()metodo insieme alla specifica della colonna che si desidera recuperare.

Ecco un codice di esempio:

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

0

È possibile utilizzare la query seguente:

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

1
Per favore aggiungi qualche spiegazione alla tua risposta in modo che altri possano imparare da essa
Nico Haase,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.