284

lets say I have 7 columns in table, and I want to select only two of them, something like this

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

In laravel eloquent model it may looks like this

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

but I guess this expression will select ALL columns where id equals 1, and I want only two columns(name, surname). how to select only two columns?

2
  • 2
    Thanks for asking the question. It's crazy as I've always done this properly in 'classic' SQL queries, but having to use Eloquent, I found it so confusing I was happy just to get it working, and was oblivious to how much memory my queries were using because I was selecting everything. Commented Sep 30, 2019 at 21:50
  • 1
    ModelName::findOrFail(1, ['name', 'surname']); Commented Mar 9, 2021 at 0:58

25 Answers 25

416

You can do it like this:

Table::select('name','surname')->where('id', 1)->get();
Sign up to request clarification or add additional context in comments.

11 Comments

let's suppose i want to select every field expect one how can i do that
First of all, when you have question, ask one. And for your case - just mention all columns instead of the one you don't want to include. It's that easy.
isn't there any other method for doing that without mentioning all columns
This works for a basic case with a single table. However, if you are using a relation over a pivot table, then this will ALSO select the pivot columns, automatically.
@OPV It just runs SELECT name, surname FROM Table where id = 1 SQL query
|
139
Table::where('id', 1)->get(['name','surname']);

3 Comments

I want the same thing but using different method. I want to select method by creating instance of model and then select column. i.e $model = new MyModel(); $model->select(['col1', 'col2']); But this thing is not working
I believe this is the way it is supposed to be used. I don't know if select() is faster than get() though.
can also be model::where('col', val)->get(['col1', 'col2']);
103

You can also use find() like this:

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

The $id variable can be an array in case you need to retrieve multiple instances of the model.

Comments

94

By using all() method we can select particular columns from table like as shown below.

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

Note: Laravel 5.4

1 Comment

I want the same thing but using different method. I want to select method by creating instance of model and then select column. i.e $model = new MyModel(); $model->select(['col1', 'col2']); But this thing is not working.
52

You first need to create a Model, that represent that Table and then use the below Eloquent way to fetch the data of only 2 fields.

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

4 Comments

This is the best answer since it works also with pivot tables in many to many relationships.
This should be the answer
Remember that the order when using pluck with two parameters is column, key - so the second item will be the array key and the first it's corresponding value.
This is the most suitable solution.
32

Also Model::all(['id'])->toArray() it will only fetch id as array.

Comments

28

Get the value of one column:

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

you can use this method with a where clause:

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

or use this method to bypass PhpStorm "Method where not found in App\Models":

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

in query builder:

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

with where clause:

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

or

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

last method result is an array

2 Comments

Important to mention that only the last query actually does what you want and only requests the id from the DB with SELECT id FROM..., rather just SELECT * FROM... which selects all columns of the table. There is a performance difference, so important to consider.
This answer is wrong! you're loading the whole row in the ram and after take what you need which might work but if the row is big, you will have performance issue. it will work but we should not write code like this. it has performance issue.
18

You can use get() as well as all()

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

1 Comment

This answer should have much more votes.
12

From laravel 5.3 only using get() method you can get specific columns of your table:

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

Or from laravel 5.4 you can also use all() method for getting the fields of your choice:

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

with both of above method get() or all() you can also use where() but syntax is different for both:

Model::all()

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

Model::get()

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

Comments

11

If you want to get a single value from Database

    Model::where('id', 1)->value('name');

2 Comments

@NachoMezzadra Actually I did :):)
@Ali Raza ... Ive been working with laravel for over 10 years.... You just blew my mind. How did I never know about this?
10

To get the result of specific column from table,we have to specify the column name.

Use following code : -

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

for example -

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

1 Comment

Please add some explanation to your answer such that others can learn from it
10
use App\Table;
// ...
Table::where('id',1)->get('name','surname');

if no where

Table::all('name','surname');

1 Comment

Good answer but square brackets are missing. Should be like: ->get(['name','surname']);
6

Also you can use pluck.

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

1 Comment

Note that pluck() is less efficient than the other methods discussed because it doesn't modify the SELECT ... query, but rather, it operates on the already-returned result set.
6

For getting multiple columns (returns collection) :

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

If you want to get columns as array use the below code:

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

If you want to get a single column try this:

Model::where('id', 1)->first(['column_name'])->column_name;

1 Comment

How is this answer different from others?
4

You can use Table::select ('name', 'surname')->where ('id', 1)->get ().

Keep in mind that when selecting for only certain fields, you will have to make another query if you end up accessing those other fields later in the request (that may be obvious, just wanted to include that caveat). Including the id field is usually a good idea so laravel knows how to write back any updates you do to the model instance.

Comments

4

You can get it like

`PostModel::where('post_status', 'publish')->get(['title', 'content', 'slug', 'image_url']`)

link

Comments

4

If you need to get one column calling pluck directly on a model is the most performant way to retrieve a single column from all models in Laravel.

Calling get or all before pluck will read all models into memory before plucking the value.

Users::pluck('email');

Comments

2

you can also used findOrFail() method here it's good to used

if the exception is not caught, a 404 HTTP response is automatically sent back to the user. It is not necessary to write explicit checks to return 404 responses when using these method not give a 500 error..

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

Comments

2

While most common approach is to use Model::select, it can cause rendering out all attributes defined with accessor methods within model classes. So if you define attribute in your model:

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

And then use: TableName::select('username')->where('id', 1)->get();

It will output collection with both first_name and username, rather than only username.

Better use pluck(), solo or optionally in combination with select - if you want specific columns.

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

or

TableName::where('id', 1)->pluck('username'); //that would return collection consisting of only username values

Also, optionally, use ->toArray() to convert collection object into array.

Comments

2

If you want to get single row and from the that row single column, one line code to get the value of the specific column is to use find() method alongside specifying of the column that you want to retrieve it.

Here is sample code:

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

Comments

1

->get() much like ->all() (and ->first() etc..) can take the fields you want to bring back as parameters;

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

Would bring back the collection but only with column1 and column2

Comments

1

If you wanted to get the value of a single column like 'name', you could also use the following:

Table::where('id', 1)->first(['name'])->name;

Comments

1

to get data from specific column use value

    $variable = DB::table('tbl_name')->where('column', '=',  $passedvariable)->value('column');

Comments

0

You can use the below query:

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

1 Comment

Please add some explanation to your answer such that others can learn from it
0

Relation with other tables can be written like this.
Model File Post.php

public function video() {
   return $this->hasMany(Video::class, "foreign_key", "local_key");
}

Controller file VideoController.php

public function index()
{
$getData = Video::with("post:title,description,id")->get(['title', 'description', 'post_id']);
return $getData;
}

Here with("post: ... model file function name post and id primary key and foreign key post_id must be and post: ... here there should be no gaps.

Specific Column Name with("post:column name") and get([column name]) get all data.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.