为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕桂英4014372 2021-09-05 16:14:57
我愿意: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 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

它不起作用的原因是因为您试图覆盖模型的关系,而您无法通过简单的分配来完成。


您可以使用该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();


查看完整回答
反对 回复 2021-09-05
?
Helenr

TA贡献1780条经验 获得超4个赞

在您的示例中,您正在使用->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();


查看完整回答
反对 回复 2021-09-05
  • 2 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信