我愿意:
Model::with('animal')->get()->each(function (&$item) {
if (condition($item)) {
$item->animal = 'Yop Override';
}
})->toArray();
但是我无法覆盖animal
。有办法吗?
我的丑陋选择是:
array_map(function($item) {
if (condition($item)) {
$item['animal'] = 'Yop Override';
}
return $item;
}, Model::with('animal')->get()->toArray());
答案 0 :(得分:4)
之所以不起作用,是因为您试图覆盖模型的关系,而这是简单分配无法完成的。
您可以使用setRelation
方法来实现所需的目标:
Model::with('animal')
->get()
->each(function ($item) {
if (true) {
$item->setRelation('animal', 'Yop override');
}
})
->toArray();
如果您想使用map
方法,那将是一回事,但是您必须在函数末尾添加一个返回值。
Model::with('animal')
->get()
->map(function ($item) {
if (true) {
$item->setRelation('animal', 'Yop override');
}
return $item;
})
->toArray();
答案 1 :(得分:0)
在您的示例中,您使用->each()
,应该使用->map()
并返回$item
。
第二,在$key/$value
内需要一个function()
。
第三,在传递其他数据时,请使用use
。
Model::with('animal')->get()->map(function ($model, $key) use (&$item) {
if (condition($item)) {
$item->animal = 'Yop Override';
}
return $item;
})->toArray();