Laravel Livewire - Select 选择后输入数据丢失

Laravel Livewire - Select input data is lost after selection

我有商品(编号、代码、名称和价格)、仓库(编号和名称)和库存(item_id、warehouse_id、库存)模型,其中库存模型具有 item_id 和 warehouse_id 关系键。我正在尝试使用 livewire 安装方法从库存模型中获取项目

public $items, $selected_id;

public function mount()
{
   $this->items = Stock::select('item_id', 'warehouse_id')->groupBy('item_id', 'warehouse_id')->get();
}

并且我在 livewire 组件的 select 输入中使用这些项目

<select wire:model='selected_id'>

   @foreach($items as $item)
       <option value='{{$item->item->id}}'>{{$item->item->code}} - {{$item->item->name}} </option>
   @endforech

</select>

这在初始加载时工作得很好。但是当我 select 来自项目 select 输入的项目时,所有项目都丢失并且在选项中得到空数组。

我不知道这段代码有什么问题。请帮我解决问题

简答

您应该只对那些应该由前端修改的属性使用 public 可访问属性。将 $selected_id 保留为 属性,但将 $items 属性 更改为您在 render 方法中传递给视图的变量,或计算的 属性.

public $selected_id;

public function getItemsProperty()
{
    return Stock::select('item_id', 'warehouse_id')->groupBy('item_id', 'warehouse_id')->get();
}

public function render()
{
    return view('some-view', [
        'items' => $this->items,
    ])
}

说明

免责声明:我还没有用调试器验证这一点,但这是我最好的猜测。

Livewire 将 public 属性序列化为可以发送到前端的格式。这就是为什么您仅限于基元(stringintarray 等)和一些 类(ModelCollection)。 Livewire 在后台将 CollectionModel 序列化为某种格式,以便它可以在下一次渲染中再次执行查询,防止后续请求中的陈旧 Models

我认为这不能正常工作,因为您在 $items 属性.

的查询中使用了 groupBy