Php Laravel雄辩的setAppends()到整个模型集合?

Php Laravel雄辩的setAppends()到整个模型集合?,php,laravel,eloquent,Php,Laravel,Eloquent,根据,可以在模型实例上使用setAppends,向模型动态添加任何可用的额外属性。然而,除了在集合中循环之外,我还没有找到一种方法来对模型集合执行此操作 有没有更聪明的方法?像这样: $facilities = Facility:all(); $facilities->setAppends(); 目前唯一的选择是: foreach ($facilities as $facility) { $facility->setAppends([ 'your_attri

根据,可以在模型实例上使用
setAppends
,向模型动态添加任何可用的额外属性。然而,除了在集合中循环之外,我还没有找到一种方法来对模型集合执行此操作

有没有更聪明的方法?像这样:

$facilities = Facility:all();
$facilities->setAppends();
目前唯一的选择是:

foreach ($facilities as $facility) {
    $facility->setAppends([
        'your_attribute_here'
    ]);
}

编辑:为了澄清,我希望在运行时动态地执行此操作。我定义的额外属性不需要在获取模型的任何地方都使用,这可能会导致大量额外开销。

在模型中定义
$appends
属性并添加自定义属性,如

protected $appends = ['your_attribute_here'];
要设置这些自定义属性的值,请定义方法


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

public function getCustomAttribute()
{
    return 'some-value';
}
集合
上定义
集合附加
宏,最好在服务提供商(例如AppServiceProvider)中,以便您可以在任何地方使用它:

Collection::macro('setAppends', function ($attributes) {
    return $this->map(function ($item) use ($attributes) {
        return $item->setAppends($attributes);
    });
});
那你就可以了

$facilities = Facility:all();
$facilities->setAppends([
    'some-value'
]);
您可以使用:


如果添加访问器和appends属性,则不需要做任何额外的工作。@chanafdo请参阅底部的“我的编辑”。我想动态地执行此操作。请查看答案。请查看底部的我的编辑。我想动态地做这件事,非常好,谢谢。基于此,我提出了一个更通用的版本,可以用与原始函数相同的方式使用。然而,我想了解一些事情,只是为了确定。这个宏是否不仅仅像我的示例那样在整个集合中循环执行相同的操作?另外,我应该在你的答案上使用编辑功能发布通用版本还是。。?我不太确定这部分的礼仪。是的,下面只是循环和动态附加足够公平。我还了解了有关集合宏的更多信息,并发现将它们放在服务提供商中会很好。是的。你可以把它放在AppServiceProvider中,问题是执行了多个查询;集合中的每行一个。有没有一种方法可以在一个查询中填充它?不确定它是否可以这样工作
每个
接收一个闭包,但即使是
$model->each(函数($row){$row->setAppends([…]);})
也不起作用我的错误是,我试图将
每个
应用于查询而不是集合。现在它起作用了。
$facilities = Facility:all();
$facilities->setAppends([
    'some-value'
]);
$facilities->each->setAppends([
    'your_attribute_here'
]);