Laravel Eloquent setAppends() 到整个模型集合?

The*_*eek 4 php laravel eloquent

根据https://laravel.com/docs/5.6/eloquent-serialization,可以setAppends在模型实例上使用以动态地向模型添加任何可用的额外属性。但是,除了遍历集合之外,我还没有找到对模型集合执行此操作的方法。

有没有更聪明的方法来做到这一点?像这样:

$facilities = Facility:all();
$facilities->setAppends();
Run Code Online (Sandbox Code Playgroud)

目前唯一的选择是:

foreach ($facilities as $facility) {
    $facility->setAppends([
        'your_attribute_here'
    ]);
}
Run Code Online (Sandbox Code Playgroud)

编辑:澄清一下,我想在运行时动态地做到这一点。我定义的额外属性在获取模型的任何地方都不需要,并且可能会导致大量额外开销。

Jon*_*eir 10

您可以使用更高阶的消息

$facilities->each->setAppends([
    'your_attribute_here'
]);
Run Code Online (Sandbox Code Playgroud)


cha*_*fdo 5

在您的模型中添加以下访问器

public function getCustomAttribute()
{
    return 'some-value';
}
Run Code Online (Sandbox Code Playgroud)

在 上定义setAppendsCollection,最好在服务提供者(例如 AppServiceProvider)中定义,以便您可以在任何地方使用它:

Collection::macro('setAppends', function ($attributes) {
    return $this->map(function ($item) use ($attributes) {
        return $item->setAppends($attributes);
    });
});
Run Code Online (Sandbox Code Playgroud)

然后你可以做

$facilities = Facility:all();
$facilities->setAppends([
    'some-value'
]);
Run Code Online (Sandbox Code Playgroud)