如何在Eloquent模型中有条件地覆盖值?

时间:2019-06-27 11:49:55

标签: php laravel eloquent

我愿意:

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());

2 个答案:

答案 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();