猿问

如何有条件地覆盖 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());


慕桂英4014372
浏览 146回答 2
2回答

慕运维8079593

它不起作用的原因是因为您试图覆盖模型的关系,而您无法通过简单的分配来完成。您可以使用该setRelation方法实现您想要的:Model::with('animal')    ->get()    ->each(function ($item) {        if (true) {            $item->setRelation('animal', 'Yop override');        }    })    ->toArray();如果你想使用这个map方法,它会是一样的,但是你必须在函数的末尾添加一个 return 。Model::with('animal')    ->get()    ->map(function ($item) {        if (true) {            $item->setRelation('animal', 'Yop override');        }        return $item;    })    ->toArray();

Helenr

在您的示例中,您正在使用->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();
随时随地看视频慕课网APP
我要回答