2014-09-26 10 views
4

如果我想用雄辩的,我可以做这样的事情得到数据库第一个用户的名字联系在一起:Pluck公司与第一使用查询生成器

$user = User::select('name')->first()->pluck('name'); 
// or $user = User::first()->pluck('name'); 

echo $user; 

获得该用户的字符串的唯一名字。

但是如果我尝试同样只使用查询生成器:

$user = DB::table('users')->select('name')->first()->pluck('name'); 

echo $user; 

我得到异常:

调用未定义的方法stdClass的::动物内脏()

但是,如果没有首先使用它将工作:

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

echo $user; 

是不是可以使用pluckfirst使用查询生成器还是我做错了什么?

PS。当然,我知道,我可以不使用pluck显示使用$user->name任何财产,但我只是好奇,为什么用雄辩它的工作原理和使用查询生成器它只能不同时具有firstpluck

回答

12

你不想当使用pluckfirst,因为它是多余的:

$query->first() // fetch first row 
     ->pluck('name'); // fetch first row again and return only name 

所以只使用pluck

$query->pluck('name'); 

它做你需要的一切。


但还有更多。

引擎盖下firstpluck运行两个单独的查询,所以:

$query->where(..)->orderBy(..)->first() // apply where and orderBy 
     ->pluck('name'); // no where and orderBy applied here! 

所以它不仅多余pluck前使用first,而且它会导致意想不到的结果。


您可以链子雄辩查询这些方法,因为它返回一个集合(get)或模型(first),但Query\Builder回报只是一个阵列(get)或stdObjectfirst)。这就是为什么你不能在查询生成器上做同样的事情。

+1

谢谢,再有没有足够的文档。我认为它只是在这种情况下得到所有列并只返回一个或修改查询(当你不使用select时),并再次只返回这个选定的列 – 2014-09-26 07:44:50

+0

Upvoting因为这个答案比我的好。 – lowerends 2014-09-26 07:47:25

+0

@MarcinNabiałek感谢'__call'神奇的方法,无处不在调用Eloquent模型中的'pluck'来代表对'Eloquent \ Builder'的调用,这就是为什么你可以对'first'的结果做到这一点。你甚至可能不会注意到它只是运行了另一个查询 - 在这里就是这种情况。 – 2014-09-26 07:52:07

1

试试这个:

$user = User::pluck('name')->first(); 
echo $user; 
0

在Laravel 5.1+,你可以使用value方法。

从文档:

如果你甚至都不需要一整行,您可以提取使用值方法记录单个值 。该方法将返回 值直接列:

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

这是它是如何工作的生成器类幕后:

/** 
* Get a single column's value from the first result of a query. 
* 
* @param string $column 
* @return mixed 
*/ 
public function value($column) 
{ 
    $result = (array) $this->first([$column]); 
    return count($result) > 0 ? reset($result) : null; 
} 
+0

而你确认它在Laravel 4中正常工作,对吧? – 2017-11-06 14:18:53

+0

没有看到laravel-4标签,谢谢!我会更新我的答案。它可能对其他人有用。 – Joren 2017-11-06 19:57:06