首先使用“查询”构建器进行操作

时间:2014-09-26 07:34:29

标签: laravel laravel-4 eloquent

如果我想使用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

4 个答案:

答案 0 :(得分:16)

您不希望将pluckfirst一起使用,因为它是多余的:

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

所以只使用pluck

$query->pluck('name');

它可以满足您的一切需求。


但还有更多。

在幕后firstpluck运行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 )或stdObjectfirst)。这就是为什么你不能在查询构建器上做同样的事情。

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