微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel Livewire在使用更改器和访问器时遇到麻烦

如何解决Laravel Livewire在使用更改器和访问器时遇到麻烦

我尝试输入一个模型,该模型的属性是浮点数,以特定单位存储在数据库中,例如体积:升。 我希望用户能够以他们选择的单位查看和输入值,例如美制加仑而不是公升,可以随时选择其他单位,例如美国品脱或百升。 为此,我允许每个用户存储各种物理量的单位集。

我打算做的是基于用户选择的保存单位创建变体和访问器,以在保存之前将自定义单位转换为公升,并在获取时将其转换为自定义单位。 这是我的模特节选

    class Equipment extends Model
{
    use HasFactory;
    protected $table = "equipments";
    protected $fillable = [
        'name',...
        'boiler_volume','boiler_dead_volume',...
    ];

    protected $appends = ['boiler_volume','boiler_dead_volume'];

    //get the user's unit transformation factor (it works and return a float number)
    private function getKVolume()
    {
        $units = Unitset::where('user_id',auth()->user()->id)->first();
        return explode(',',$units->volume)[2];
    }

    //BOILER-----------------
    public function setBoilerVolumeAttribute($value)
    {
        if (is_numeric($value) and $value !== null and $value != 0) {
            $this->attributes['boiler_volume'] = $value * $this->getKVolume();
        }
    }
    public function getBoilerVolumeAttribute($value)
    {
        if (is_numeric($value)) {
            return $value / $this->getKVolume();
        }
    }
    //------------------
    public function setBoilerDeadVolumeAttribute($value)
    {
        if (is_numeric($value) and $value !== null and $value != 0) {
            $this->attributes['boiler_dead_volume'] = $value * $this->getKVolume();
        }
    }

    public function getBoilerDeadVolumeAttribute($value)
    {
        if (is_numeric($value)) {
            return $value / $this->getKVolume();
        }
    }

现在在livewire组件中出现了规则

protected $rules =[
    ...
    'equipment.boiler_volume'=>'required|numeric','equipment.boiler_dead_volume'=>'required|numeric',...
];

最后是刀片视图中表单的相关部分

<x-input.group label="{{ __('Boiler Tun Volume ') }} ({{ explode(',$unitset->volume)[0] }})" for='
            boiler_volume' :error="$errors->first('equipment.boiler_volume')"
        class="flex flex-col w-full p-2 border border-jbrown-peachpuf bg-jbrown-darker rounded-md ">
        <x-input.text wire:model.lazy="equipment.boiler_volume" type="number" step="0.001"
            class="border border-red-200 bg-red-100" name="boiler_volume" id="boiler_volume" value="" />
    </x-input.group>
    <x-input.group label="{{ __('Boiler Tun Dead Volume ') }} ({{ explode(',$unitset->volume)[0] }})" for='
            boiler_dead_volume' :error="$errors->first('equipment.boilen_dead_volume')"
        class="flex flex-col w-full p-2 border border-jbrown-peachpuf bg-jbrown-darker rounded-md ">
        <x-input.text wire:model="equipment.boiler_dead_volume" type="text" class="border border-red-200 bg-red-100"
            name="boiler_dead_volume" id="boiler_dead_volume" value="" />
    </x-input.group>

您可以看到第一个输入使用数字类型,第二个输入使用文本类型。 这仅用于解释,因为数字输入类型或文本输入类型的问题都相同。但是,现在让我说说麻烦是什么。

怎么了? 问题在于,对于第二个字段 equipment.boiler_dead_volume ,一旦输入了值,便无法将其删除(例如,用于更正)。您可以删除输入的所有数字,但第一个数字。尽管如此,如果使用向左箭头键将光标置于字段的开头,则可以输入新值,然后删除最后一个字符,但不要让该字段为空。 这对用户来说很烦。

我必须补充一点,如果不使用增变器和访问器,则此行为不存在。另外, boiler_volume 的第一个字段即使使用存取器和增幅器也能正常工作。 最后和最后,所有其他字段的行为相同,即错误

注意 线

 protected $appends=...

没有任何改变。

其他奇怪行为 查看转换器和访问器,您会看到一些检查值是否为数字而不是null。这是由于以下事实:如果不进行此检查,则每次清空字段时,应用程序都会抱怨该值不是数字。

我很乐意获得一些有关此问题的帮助!

解决方法

似乎wire:model.lazy是强制性的。在第一组中,我在不知不觉中又使用了它。 因此,在这种情况下,懒惰是必需的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。