如何在Laravel中使用->append v. protected $appends?

3
你如何向一个查询添加属性,但不影响模型的所有查询。我知道你可以向模型的所有查询添加属性通过添加...
protected $appends = ['icon'];

public function getIconAttribute(){
    return Gravatar::src($this->email, 100).'&r=g&d=mm';
}

我希望您只为一个查询添加它。
$usernames = User::where('username', 'LIKE', '%'.$request->get('search').'%')
   ->append('icon')->get();

但是这会导致错误Call to undefined method Illuminate\Database\Query\Builder::append()

我能够看到该方法,但感觉自己很蠢。 https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Model.html#method_append

1个回答

10

append()方法属于Model而不是Builder,因此您需要为每个模型调用它。

您可以像这样:

$usernames = User::where('username', 'LIKE', '%' . $request->get('search') . '%')
    ->get()
    ->map(function ($user) {
        return $user->append('icon');
    });

>= Laravel 5.4

Higher Order Messaging 在5.4版本中被引入,因此你现在可以使用以下方式:

$usernames = User::where('username', 'LIKE', '%' . $request->get('search') . '%')
    ->get()
    ->map->append('icon');

>= Laravel 7.6

在Laravel 7.6中,append()方法被引入到Eloquent集合中:

$usernames = User::where('username', 'LIKE', '%' . $request->get('search') . '%')
    ->get()
    ->append('icon');

我看到了这个pull request,让我想到你可以在查询中完成它吗? - whoacowboy
@whoacowboy 你让我有了希望,但是那个 pull request 只是一般添加了 append() 方法。 - Rwd
太糟糕了,但我感觉自己变得不那么愚蠢了。谢谢你的帮助! - whoacowboy
@whoacowboy 我刚试着向代码库提交一个拉取请求,想把append添加到集合中,但Taylor不同意。 - Rwd
不错,很不错。Laravel是一个开源的框架。发个链接,我会点赞的。 - whoacowboy
@whoacowboy,是的,我知道你的意思。https://github.com/laravel/framework/pull/16200 顺便说一句,谢谢 :) - Rwd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接