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

时间:2021-07-25 04:16:01

标签: laravel laravel-livewire

有一个产品模型有很多描述关系。
描述关系有两列,计数,正文。

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

我必须提到从关系中获取数据工作正常,只是无法在 wire:model 属性的输入标记中显示数据!我认为问题在于受保护的 $ruleswire:model 值的键定义!

更新类:

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

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

1 个答案:

答案 0 :(得分:1)

有几件事我想提一下,首先是您的视图应该始终只有一个根 HTML 元素 - 在循环中生成的后续元素也应该有一个唯一的里面有 wire:key 的根元素。 wire: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>

最后,您需要将描述声明为类的公共属性,并将它们存储在那里。

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;
}