没有匹配数据库列的 Laravel 变元

Laravel mutators without a matching database column

提问人:miken32 提问时间:5/3/2022 更新时间:5/3/2022 访问量:387

问:

我正在考虑将我的 mutator 和访问器更新为 Laravel 9 中引入的新语法,但我似乎无法让它工作。

我目前有一个模型,它与充当键值存储的对象有关系。作为简写,我使用变值器来设置几个更常用的设置。非常简化,看起来像这样:MorphManySettings

class Item extends Model
    public function setSomeSettingAttribute($value)
    {
        $key = "some_setting";
        Setting::updateOrCreate(
            ["settable_id" => $this->id, "settable_type" => self::class, "key" => $key],
            ["value" => $value]
        );
    }
}

$m = Item::find(1);
// typically in a controller this would be $request->all()
$arr = ["some_setting" => 234];
$m->update($arr);

这工作正常,并且设置已更新。需要注意的重要一点是,数据库中没有名为 的列。some_setting


在新代码中,mutator 似乎应该如下所示:

public function someSetting(): Attribute
{
    $key = "some_setting";
    return Attribute::make(
        set: function ($value) use ($key): void {
            Setting::updateOrCreate(
                ["settable_id" => $this->id, "settable_type" => self::class, "key" => $key],
                ["value" => $value]
            );
        }
    );
}

但这是行不通的;Laravel 尝试在列中插入某些内容,导致 SQL“找不到列”错误。some_setting

有没有办法解决这个问题,不涉及编辑我所有的控制器代码来删除假列?或者,如果没有,旧的 mutator 语法是否以任何方式被弃用?

PHP Laravel 雄辩 的突变器

评论

0赞 IGP 4/19/2023
旧的 mutator 语法没有被弃用,我怀疑它会被弃用。从某种意义上说,新语法有点不错,你可以用相同的方法捆绑 setter 和 getter,但如果你只有两者中的一个,它最终会感觉像是一无所获。

答: 暂无答案