Laravel 5.2 - pluck()方法返回数组

85

我正在尝试升级我的项目L5.1-> L5.2。在升级指南中,有一件事对我来说不是很清楚:

Collection、查询生成器和Eloquent查询生成器对象上的lists方法已重命名为pluck。方法签名保持不变。

没问题,将lists()重命名为pluck()不是问题。但是关于在L5.0和L5.1中有用的pluck()方法怎么办呢?

5.0文档中可以看到:

从行中检索单个列

$name = DB::table('users')->where('name', 'John')->pluck('name');
在L5.2中,旧的pluck()方法有什么替代方法? 更新: 示例:
var_dump(DB::table('users')->where('id', 1)->pluck('id'));

L5.1:

// int(1)

L5.2:

// array(1) { [0]=> int(1) }

16
是的,这很令人困惑。在5.0中,“pluck()”表示从一行中选择1个字段。然后在5.1中,他们删除了“pluck()”,并用“value()”替换了它。然后在5.2中,他们又用“pluck()”取代了返回整个列的“lists()”。所以如果你从4.2开始使用,可能会感到困惑:/ - Captain Hypertext
5个回答

128

pluck()的当前替代方法是value()


2
谢谢!这绝对应该在升级指南中,因为它是一个破坏性的变更。 - Limon Monte
2
我看到这是在5.1的升级指南中:http://laravel.com/docs/5.2/upgrade#upgrade-5.1.0 我犯了错,没有注意到上一个版本中的更改。 - Limon Monte
关于这个更改,实际上已经有通知了:“Eloquent 集合实例现在为以下方法返回基础 Collection (Illuminate\Support\Collection) 类:pluck,…” - Limon Monte
在切换类型操作中,使用值作为准备好的非数组形式要容易得多。 - DragonFire
1
有人能解释一下这种命名背后的原因吗?为什么不叫“column”? - ddruganov

22

Laravel的pluck方法返回一个数组。

如果您的查询是:

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

那么数组会变成这样(键是项目的索引。自增值):

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

但如果你这样做:

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

那么关键是实际数据库中的索引。

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

你可以将任何值设置为键。


22

在 Laravel 5.1+ 中,你可以使用 value() 替代 pluck。

要获取第一个出现的值,你可以使用以下任一方法:

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

或使用,

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

14

我使用 Laravel 7.x,并使用以下代码作为解决方案:->get()->pluck('id')->toArray();

它会返回一个 id 数组 [50,2,3],这是我所用的整个查询:

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

AModel::select('id',...)->where(...)->get()->pluck('id'); 返回 id 的整数值数组,而 AModel::select('id',...)->where(...)->get()->pluck('id')->toArray(); 返回类似于 [0=>id0, 1=>id1,...., n=>idN] 的数组,已经测试过。 - CodeToLife

-1
在原始示例中,为什么不在数据库查询中使用select()方法呢?
$name = DB::table('users')->where('name', 'John')->select("id");

这将比使用PHP框架更快,因为它将利用SQL查询来为您选择行。对于普通集合,我不认为这适用,但由于您正在使用数据库...

Larvel 5.3: 指定选择子句


需要添加 ->get(); 你仍然需要使用PHP来格式化数组。 - Harry Bosh
Php的操作比Mysql查询快得多。 - Ankit Balyan
10
@AnkitBalyan,你在讽刺吗?mysql比php快得多。尝试处理每个表中的一百万行数据... - Felix Eve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接