Laravel 5.2 - pluck() method returns array

PhpLaravelEloquentQuery BuilderLaravel 5.2

Php Problem Overview


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

Php Solutions


Solution 1 - Php

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

Solution 2 - Php

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.

Solution 3 - Php

> 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();

Solution 4 - Php

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();

Solution 5 - Php

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLimon MonteView Question on Stackoverflow
Solution 1 - Phpuser1669496View Answer on Stackoverflow
Solution 2 - PhpNuOneView Answer on Stackoverflow
Solution 3 - PhpreshmaView Answer on Stackoverflow
Solution 4 - PhpFurqan S. MahmoudView Answer on Stackoverflow
Solution 5 - PhpJeff KopmanisView Answer on Stackoverflow