如何在 livewire wire:model 中绑定模型关系值?

how to bind the model relation value in livewire wire:model?

有一个具有许多描述关系的产品模型。
descriptions 关系有两列,count,body。

我必须如何定义 wire:model 值才能在 Livewire 更新组件中显示选定的产品描述值?

我必须提到从关系中获取数据工作正常只是不能在 wire:model 属性的输入标签中显示数据!我认为问题出在 protected $ruleswire:model value!

的关键定义上

更新 Class:

public $product;

protected $listeners = ['selectedProduct'];

public function selectedProduct($id){
    $this->product = Product::with('descriptions')->findOrFail($id);
}

protected $rules = [
    "description.count" => "required",
    "description.body" => "required",
];

livewire 视图:

@if($product)
    @foreach($product->descriptions as $description)
        <input type="text" wire:model="description.count">
        <texatarea wire:model="description.body"></texatarea>
    @endforeach
@endif

循环和字段数重复正确但没有显示数据!

有几件事我想提一下,首先是您的视图应该始终只有 一个 根 HTML 元素 - 以及后续元素在循环中生成的元素内部也应该有一个唯一的根元素,上面有 wire:keywire:key 在您的页面上应该是独一无二的。

然后我们需要查看规则 - 任何模型都需要规则才能在输入元素中可见,这是正确的,但是您有一个元素集合,因此规则需要反映这一点。为此,您指定一个通配符作为键

protected $rules = [
    "description.*.count" => "required",
    "description.*.body" => "required",
];

字段然后必须绑定到一个索引,所以 Livewire 知道它在一个集合中。

<div>
    @if ($product)
        @foreach($product->descriptions as $index=>$description)
            <div wire:key="product-description-{{ $description->id }}">
                <input type="text" wire:model="descriptions.{{ $index }}.count">
                <texatarea wire:model="descriptions.{{ $index }}.body"></texatarea>
            </div>
        @endforeach
    @endif
</div>

最后,您需要在 class 上将描述声明为 public 属性,并将它们存储在那里。

public  $product;
public  $descriptions;

protected $listeners = ['selectedProduct'];
protected $rules = [
    "description.*.count" => "required",
    "description.*.body" => "required",
];

public function selectedProduct($id){
    $this->product = Product::with('descriptions')->findOrFail($id);
    $this->descriptions = $this->product->descriptions;
}