【问题标题】:Pluck together with first using Query builder与第一次使用查询生成器一起采摘
【发布时间】:2018-12-13 17:33:48
【问题描述】:

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

不能使用查询生成器将pluckfirst 一起使用,还是我做错了什么?

PS。当然,我知道我可以使用$user->name 显示任何属性而不使用pluck,但我只是好奇为什么使用Eloquent 它有效,而使用Query Builder 它只有在没有firstpluck 时才有效

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案1】:

    您不想将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!
    

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


    您可以在 Eloquent 查询上链接这些方法,因为它返回一个集合 (get) 或模型 (first),但 Query\Builder 只返回一个数组 (get) 或 stdObject (@987654336 @)。这就是为什么你不能在查询生成器上做同样的事情。

    【讨论】:

    • 谢谢,同样没有足够的文档。我认为它只是在这种情况下获取所有列并仅返回一个或修改查询(当您不使用选择时)并再次仅返回此选定列
    • 赞成,因为这个答案比我的好。
    • @MarcinNabiałek 感谢 __call 在 Eloquent 模型上到处调用 pluck 的魔术方法代理了对 Eloquent\Builder 的调用,这就是为什么您可以在 first 的结果上执行此操作的原因。您甚至可能没有注意到它只是运行了另一个查询 - 就是这种情况。
    • 在这种情况下建议使用 @Joren 的 User::select('name')->value('name') 选项更好
    【解决方案2】:

    在 Laravel 5.1+ 中,你可以使用 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;
    }
    

    【讨论】:

    • 没有看到 laravel-4 标签,谢谢!我会更新我的答案。它可能对其他人有用。
    • 在我执行 value() 之前,我得到了一堆不同的值类型。完全有用。 $exams = \App\Modules::where('id', $id)->value('exams');它以简单的值类型(int 或 string)返回我想要的考试 ID,而不是对象或集合。 Laravel 框架 5.5.44
    【解决方案3】:

    试试这个:

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

    【讨论】:

      【解决方案4】:

      pluck() 的当前替代方案是 value()

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

        DB::table('users')->value('name');
      

      或使用,

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-07
        • 1970-01-01
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        • 2018-10-27
        • 2017-03-16
        • 2010-09-29
        相关资源
        最近更新 更多