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

Mar*_*łek 8 laravel eloquent laravel-4

如果我想使用eloquent获取数据库中第一个用户的名称,我可以这样做:

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

echo $user;
Run Code Online (Sandbox Code Playgroud)

仅将此用户的名称作为字符串.

但是,如果我仅使用查询生成器尝试相同的操作:

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

echo $user;
Run Code Online (Sandbox Code Playgroud)

我得到例外:

调用未定义的方法stdClass :: pluck()

但是没有先使用它会起作用:

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

echo $user;
Run Code Online (Sandbox Code Playgroud)

这难道不是可以使用pluckfirst使用查询生成器或我做错了什么?

PS.当然我知道我可以使用$user->name而不使用显示任何属性,pluck但我只是好奇为什么使用Eloquent它工作并使用查询生成器它只有当没有和两个firstpluck

Jar*_*zyk 18

你不希望使用pluckfirst,因为它是多余的:

$query->first() // fetch first row
      ->pluck('name'); // fetch first row again and return only name
Run Code Online (Sandbox Code Playgroud)

所以只使用pluck:

$query->pluck('name');
Run Code Online (Sandbox Code Playgroud)

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


但还有更多.

下罩firstpluck运行2个独立的查询,因此:

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

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


您可以在Eloquent查询上链接这些方法,因为它返回一个collection(get)或model(first),但Query\Builder只返回一个数组(get)或stdObject(first).这就是为什么你不能在查询构建器上做同样的事情.


Jor*_*ren 8

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

从文档:

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

$email = DB::table('users')->where('name', 'John')->value('email');
Run Code Online (Sandbox Code Playgroud)

这是在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;
}
Run Code Online (Sandbox Code Playgroud)