如果我想使用eloquent获取数据库中第一个用户的名字,我可以这样做:
$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 :: pluck()
但是没有先使用它会起作用:
$user = DB::table('users')->select('name')->where('id',1)->pluck('name');
echo $user;
是否无法使用pluck
first
使用查询构建器,或者我做错了什么?
PS。当然我知道我可以使用$user->name
显示任何属性而不使用pluck
但我只是好奇为什么使用Eloquent它有效并且使用查询生成器它只有在没有{{1}时才有效}和first
答案 0 :(得分:16)
您不希望将pluck
与first
一起使用,因为它是多余的:
$query->first() // fetch first row
->pluck('name'); // fetch first row again and return only name
所以只使用pluck
:
$query->pluck('name');
它可以满足您的一切需求。
但还有更多。
在幕后first
和pluck
运行2个单独的查询,所以:
$query->where(..)->orderBy(..)->first() // apply where and orderBy
->pluck('name'); // no where and orderBy applied here!
因此,在first
之前使用pluck
不仅多余,而且还会导致意外结果。
您可以在Eloquent查询中链接这些方法,因为它返回一个集合(get
)或模型(first
),但Query\Builder
只返回一个数组(get
)或stdObject
(first
)。这就是为什么你不能在查询构建器上做同样的事情。
答案 1 :(得分:8)
在Laravel 5.1+中,您可以使用value
方法。
来自文档:
如果您甚至不需要整行,则可以提取单个值 来自使用value方法的记录。这个方法会返回 列的值直接:
$email = DB::table('users')->where('name', 'John')->value('email');
这是它在Builder类的幕后工作的方式:
/**
* 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;
}
答案 2 :(得分:2)
试试这个:
$user = User::pluck('name')->first();
echo $user;
答案 3 :(得分:1)
pluck() 的当前替代方法是 value() 。
要首次出现,您可以使用
DB::table('users')->value('name');
或使用
DB::table('users')->pluck('name')->first();