Accessor 使用变异器和访问器时出现Laravel livewire问题
我尝试输入一个模型,其属性是以一定单位存储在数据库中的浮点数,例如体积:升。 我希望用户能够查看并输入他们选择的单位值,例如美国加仑,而不是升,允许用户随时选择其他单位,例如美国品脱或百公升。 为了实现这一点,我允许每个用户为不同的物理量存储一个单位集 我打算做的是根据用户选择的单位创建变异器和访问器,在保存之前将自定义单位转换为升,在获取时将升转换为自定义单位。 这是我的模型摘录Accessor 使用变异器和访问器时出现Laravel livewire问题,accessor,mutators,laravel-livewire,Accessor,Mutators,Laravel Livewire,我尝试输入一个模型,其属性是以一定单位存储在数据库中的浮点数,例如体积:升。 我希望用户能够查看并输入他们选择的单位值,例如美国加仑,而不是升,允许用户随时选择其他单位,例如美国品脱或百公升。 为了实现这一点,我允许每个用户为不同的物理量存储一个单位集 我打算做的是根据用户选择的单位创建变异器和访问器,在保存之前将自定义单位转换为升,在获取时将升转换为自定义单位。 这是我的模型摘录 class Equipment extends Model { use HasFactory;
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>
不会改变任何事情
其他奇怪行为
查看mutator和accessor,您可以看到一些检查,以确保该值是数值而不是null。这是因为如果不进行此检查,每次字段清空时,应用程序都会抱怨该值不是数字
我会很高兴得到一些帮助解决这个问题 似乎wire:model.lazy是必需的。在第一组中,我在另一个时间使用了它,但没有意识到。 因此,在这种情况下,懒散是强制性的
protected $appends=...