Laravel 5.2 - pluck() method returns array
Asked Answered
P

5

86

I'm trying to upgrade my project L5.1 -> L5.2. In upgrade guide there's one thing which isn't clear for me:

The lists method on the Collection, query builder and Eloquent query builder objects has been renamed to pluck. The method signature remains the same.

That's ok, rename refactoting from lists() to pluck() isn't a problem. But what with useful pluck() method which was in L5.0 and L5.1?

From the 5.0 documentation:

Retrieving A Single Column From A Row

$name = DB::table('users')->where('name', 'John')->pluck('name');

What is the alternative for old pluck() method in L5.2?

UPDATE:

Example:

var_dump(DB::table('users')->where('id', 1)->pluck('id'));

L5.1:

// int(1)

L5.2:

// array(1) { [0]=> int(1) }
Potentiometer answered 21/12, 2015 at 22:7 Comment(1)
Yeah, this is pretty confusing. In 5.0, pluck() meant select 1 field from a row. Then in 5.1, they removed pluck() and replaced it with value(). Then in 5.2, they replace lists(), which returns the whole column, with pluck(). So if you've been around since 4.2, you might get confused :/Frimaire
B
129

The current alternative for pluck() is value().

Butterfish answered 21/12, 2015 at 22:28 Comment(5)
Thank you! This absolutely should be in the upgrade guide as it's breaking change.Potentiometer
I see that it is in upgrade guide for 5.1: laravel.com/docs/5.2/upgrade#upgrade-5.1.0 My bad I didn't catch this change in prev release.Potentiometer
There is actually notice about this change: "The Eloquent collection instance now returns a base Collection (Illuminate\Support\Collection) for the following methods: pluck, ..."Potentiometer
It is much easier to use value as it is in ready non array form.. especially in toggle type operationsJointer
can someone please explain the reasoning behind such naming? why not "column"?Wilie
W
24

In Laravel 5.1+, you can use the value() instead of pluck.

To get first occurence, You can either use

DB::table('users')->value('name');

or use,

DB::table('users')->where('id', 1)->pluck('name')->first();
Wicker answered 13/12, 2018 at 9:38 Comment(0)
H
22

laravel pluck returns an array

if your query is:

 $name = DB::table('users')->where('name', 'John')->pluck('name');

then the array is like this (key is the index of the item. auto incremented value):

[
    1 => "name1",
    2 => "name2",
    .
    .
    .
    100 => "name100"
]

but if you do like this:

$name = DB::table('users')->where('name', 'John')->pluck('name','id');

then the key is actual index in the database.

key||value
[
    1 => "name1",
    2 => "name2",
    .
    .
    .
    100 => "name100"
]

you can set any value as key.

Helprin answered 11/6, 2018 at 11:58 Comment(0)
M
14

I use laravel 7.x and I used this as a workaround:->get()->pluck('id')->toArray();

it gives back an array of ids [50,2,3] and this is the whole query I used:

   $article_tags = DB::table('tags')
    ->join('taggables', function ($join) use ($id) {
        $join->on('tags.id', '=', 'taggables.tag_id');
        $join->where([
            ['taggable_id', '=', $id],
            ['taggable_type','=','article']
        ]);
    })->select('tags.id')->get()->pluck('id')->toArray();
Mailbag answered 2/7, 2020 at 20:37 Comment(1)
AModel::select('id',...)->where(...)->get()->pluck('id'); gives array of integer values of id, when AModel::select('id',...)->where(...)->get()->pluck('id')->toArray(); gives array alike [0=>id0, 1=>id1,...., n=>idN], Have tested.Fasta
F
-1

In the original example, why not use the select() method in your database query?

$name = DB::table('users')->where('name', 'John')->select("id");

This will be faster than using a PHP framework, for it'll utilize the SQL query to do the row selection for you. For ordinary collections, I don't believe this applies, but since you're using a database...

Larvel 5.3: Specifying a Select Clause

Feme answered 21/9, 2016 at 17:38 Comment(3)
need to add ->get(); you still need to use PHP to format the arraySaracen
Php operations are much faster than Mysql queries.Inquisitionist
@AnkitBalyan are you being sarcastic? mysql is MUCH faster than php. Try processing a million rows in each...Pierrette

© 2022 - 2024 — McMap. All rights reserved.