为什么要拔掉(' id')返回所有id-s而不只是一个?

时间:2016-05-02 17:00:30

标签: php laravel laravel-5 eloquent laravel-5.2

以下查询返回每个Quote的id-s,而不只返回一个:

Quote::find(1)->pluck('id'); // --> [1, 2, 3, 4, ...]

为什么会这样?

更新

奇怪的是,查询:

Quote::where('id', 1)->pluck('id'); // --> [1]

按预期工作。

2 个答案:

答案 0 :(得分:4)

(基本上)有两种pluck() - 一种适用于集合,另一种适用于Builder个对象。当你这样做

Quote::where('id', 1)->pluck('id');

然后你有一个Builder对象,因为在拔除之前你还没有从数据库中返回任何东西 - 你还在构建查询。这样就行了,因为这个选择被添加到查询中并执行了。

但是,当您执行Quote::find(1)时,会得到一个Quote对象 - 既不是Builder也不是Collection。相反,Laravel创建了一个新查询,它会根据您所依据的模型为您从数据库中提取值。在这种情况下,这是Quote

此行为在5.2中已更改,因此在5.1中,您只需返回列值 - 1,如预期的那样。但pluck()正在接管早期版本的Laravel中曾经被称为lists()的东西,从5.2开始。所以你的结果是正确的 - 但令人困惑。

答案 1 :(得分:4)

Quote::find(1)正在返回一个Quote对象,而不是一个Quotes集合。然后,您在该引用对象上调用pluck('id')。由于Quote对象实际上没有pluck()方法,因此实际做的是为引号创建一个新的查询构建器实例,并调用pluck。就像你Quote::pluck('id')一样。这就是你获得所有ID的原因。

由于Quote::find(1)将返回Quote对象,因此您无需在其上调用pluck()。您可以进入酒店。

$quote = Quote::find(1);
echo $quote->id;