Laravel 使用查询生成器与第一个一起提取

Laravel 使用查询生成器与第一个一起提取,laravel,laravel-4,eloquent,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')->

如果我想使用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::pull()

但如果不先使用,它将起作用:

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

echo $user;
是否无法使用查询生成器将
pulk
first
一起使用,还是我做错了什么


注:当然我知道我可以使用
$user->name
显示任何属性,而不必使用
pulk
,但我只是好奇为什么使用Eloquent它可以工作,而使用Query Builder它只能在没有
first
pulk

的情况下工作。你不想使用
pulk
first
的情况下工作,因为它是多余的:

$query->first() // fetch first row
      ->pluck('name'); // fetch first row again and return only name
因此,只需使用
拔出

$query->pluck('name');
它能满足你所有的需要


但还有更多

在引擎盖下,首先运行两个独立的查询,以便:

$query->where(..)->orderBy(..)->first() // apply where and orderBy
        ->pluck('name'); // no where and orderBy applied here!
因此,在
pull
之前先使用
不仅是多余的,而且还会导致意外的结果


您可以在雄辩的查询上链接这些方法,因为它返回集合(
get
)或模型(
first
),但
query\Builder
只返回数组(
get
)或
stdObject
first
)。这就是为什么在查询生成器上不能执行相同的操作。

请尝试以下操作:

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

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

从文档中:

如果甚至不需要整行,可以提取单个值 使用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;
}
pluck()的当前备选方案是value()

要获得第一次出现,您可以使用

  DB::table('users')->value('name');
或使用,

 DB::table('users')->pluck('name')->first();

谢谢,同样没有足够的文档。我认为在本例中,它只是获取所有列,并只返回一个或修改查询(当您不使用select时)并且再次只返回所选的columnUpvoting,因为这个答案比我的好。@MarcinNabiałek多亏了
\uu call
magic methods everywhere调用
pluck
,在雄辩模型上代理对
雄辩\Builder
的调用,这就是为什么您可以首先对
的结果执行此操作的原因。您可能甚至没有注意到它只是运行了另一个查询—这里就是这样。在本例中,最好使用User::select('name')->value('name')选项,建议@JorenDidn不要看到laravel-4标记,谢谢!我会更新我的答案。它可能对其他人有用。在我做value()之前,我得到了一堆不同的值类型。非常有用$考试=\App\Modules::where('id',$id)->value('exames');它以简单的值类型(int或string)而不是对象或集合返回我想要的检查ID。Laravel框架5.5.44